Willkommen zur inoffiziellen AFP 2.x - FAQ

V1.08c (30.03.2003)


Beiträge von:


Peter Herzog, Rudi Vogel, Sönke Freitag, Jürgen Mayer, Ralph J.Schlaefer, Ralph Rutschmann, Stephan Perlwitz, Thomas Jakober, Christof Lange, Marco Wotschadlo
Entnommen aus:

dFPUG-Forum, AFP-Forum, Direkt
Zusammengestellt von: Sönke Freitag
Stets aktuelle Version : http://www.afp-hosting.de/afpfaq.htm

Disclaimer: Die hier wiedergegebenen Informationen werden kostenlos zur Verfügung gestellt - eine Haftung für Korrektheit und Brauchbarkeit wird nicht übernommen. Benutzung der Samples und Informationen auf eigene Gefahr ! Foxpro, Visual Foxpro und Microsoft sind Warenzeichen oder eingetragene Warenzeichen der Fa. Microsoft, alle weiteren genannten Produkte sind Warenzeichen oder eingetragene Warenzeichen der entsprechenden Firmen. Alle Links verweisen auf selbständige und unabhängige Domains anderer Betreiber.Der Autor haftet nicht für Inhalte dieser Domains und macht sich diese nicht zu eigen. Sollte ein Link nicht konform mit geltender deutscher Rechtssprechungsein, so wird der Autor diesen Link nach Inkenntnissetzung umgehend entfernen.


Änderungen gegenüber der letzten FAQ werden mit <geändert> oder <neu> gekennzeichnet.


    1. Allgemeine Tips
    2. Installation
    3. Parameterübergabe & Cookies
    4. Application.prg
    5. Inhalt des AFP-Verzeichnisses
    6. AFP.INI
    7. Codesamples
    8. Fox.Browse - Beispiele für Ini-Dateien
    9. AFP - Gotchas
    10. AFP Undokumentierte Tricks
    11. Testen von AFP Anwendungen / Styleguides / Tuning

      Anhang A: Wo gibt es Programme & Sample-Codes zu den AFP's ?
      Anhang B: Welche Firmen bieten AFP-Programmierung an ?



1. Allgemeine Tips

F: Wie konfiguriere ich Dreamweaver 3 und 4 zur Anzeige von AFP-Dateien ?


F: Welches Server-Betriebssystem ist empfehlenswert


F: Wieviele parallele User verkraften die AFP's ?


F: Wieviel Speicher wird verbraucht ?


F: Welche Hardware ist Empfehlenswert


F: Wo bekomme ich Informationen zum IIS - Webserver


F: Was ist die aktuelle Versionsnummer der AFP's


F: Wie beende ich einen AFP-Task und starte die AFP neu, damit Änderungen in afp.ini, afpinit.prg, etc. wirksam werden?


F: Was ist ein AFP - Cookie, wofür wird dieser gebraucht ?


F: Wo spiele ich das erhaltene Lizenzfile AFPLIC.FXP ein ?


F: Wo bekomme ich weitere Informationen zu den AFP's


F: Wie lange verbleibt die AFP.dll im Speicher, wenn kein Seitenzugriff erfolgt


F:Wie verhindere ich bei der Entwicklung eigener ISAPI-DLL's und AFP-Anwendungen die Meldung "die Datei ist in Benutzung" ?

oder:

oder:


F: Wie sende ich E-Mails mit Umlauten / wie ändert man den Charset auf iso-8859-1 der wwwIPStuff.dll die bei der AFP2.4 beiliegt ? <neu 03.01.2003>

Ich benutze zum Senden von E-Mails die wwIPStuff.dll der ersten AFP-Version. Leider werden die
deutschen Umlaute nicht richtig dargestellt, da wwIPStuff die Mail im US-Ascii Code verschickt.

Und zwar mit:
X-Mailer: West Wind Web Connection
Mime-Version: 1.0
Content-Type: text/html; charset="us-ascii"

A: Patchen der DLL hilft - Man nehme einfach einen HEX-Editor, suche nach "us-ascii" und überschreibe es mit iso-8859-1.

Also vorher: charset="us-ascii"
und nachher: charset=iso-8859-1

Die " werden nicht benötigt und können überschrieben werden.

 

2. Installation

Windows NT Server
Vgl. auch Anleitung & www.active-foxpro-pages.de


US NT 4.0 als Standalone-Server, 3 NTFS - Partitionen mindestens <geändert 25.09.2002>

1. Partition: Swapfiles (die SWAP-Partition ist am Anfang der Festplatte am Schnellsten, größe etwa 4x Größe des Hauptspeichers.)

2
. Partition: Boot (ca 2 GB)

3. Partition: Webs

(Vorschlag: 4. Partition: Symantec Ghost-Backup-Files - FAT Dateisystem)

System - Installation nicht im Standardverzeichnis C:\WINNT sonder D:\IRGENDWAS (gegen Hacker etc.)

NT4 - Client 1. Option (Lizenz pro Anmeldender)

US ServicePack 4.0

US IE 4.01

Outlook, Media, ADO aus IE4 manuell wieder deinstallieren

US OptionPack Custom Installation

- Keine Frontpage extensions, wenn nicht benötigt
- Keine Samples (Sicherheitsgründe)
- Kein HTML IIS - Service-Manager (Sicherheitsgründe)
- Keine Data Access Components (und Subcomponents) (Sicherheitsgründe)
- Kein Scripting Host (Sicherheitsgründe)
- Keine RAD Interdev Files, wenn nicht benötigt
- WWW nicht auf Laufwerk C:\ installieren (Sicherheitsgründe - Stichwort: Directory Traversal)
- MTS nicht mit dem Default-Namen installieren (Sicherheitsgründe)

US IISUpdate (evtl. mit SP6a überflüssig, aber noch nicht getestet)

US ServicePack 4.0 (nocheinmal)

VFP6 oder WebApp (VFP Runtime mit Servicepack 3)


VFP- Servicepack 3

AFP installieren

US NT - ServicePack 6a (ERST JETZT !!!)

VFP6 Servicepack 4 (ERST JETZT !!!)

Post SP 6a Fixes

NT + IIS Security Fixes

http://www.microsoft.com/ntserver/nts/downloads/default.asp

Internet-Dienstmanager starten und im Standartweb die Eigenschaften ändern:
Basisverzeichnis => Konfiguration => Hinzufügen

PROGRAMM: C:\inetpub\scripts\afp.dll
ERWEITERUNG: .afp
SKRIPTMODUL: JA
ZUERST ÜBERPRÜFEN: JA (?)

OK speichern und nun das Ganze nocheinmal

=> Hinzufügen
PROGRAMM: C:\inetpub\scripts\afp.dll
ERWEITERUNG: .fxp
SKRIPTMODUL: JA
ZUERST ÜBERPRÜFEN: JA (?)

evtl. die PRG-Endung ebenfalls mappen, damit die Application.prg nicht
von Besuchern gelesen werden kann.

Das Web beenden, wieder starten... Fertig.

Nun den Browser starten und "http://localhost/allparameter.afp" eingeben.
Jetzt müsste die AFP laufen.

Jetzt den NT-Server gemäß vorschlagsliste bei Microsoft absichern. (Dateisicherheit).

 

Eventuelle Probleme bei der Installation unter NT:



Windows 95/98 (& Win NT Personal Web Server)

Siehe www.active-foxpro-pages.de & Anleitung der AFP's

 

Installation eines Updates:

  1. Webserverdienst herunterfahren. Am besten durch KILL inetinfo.exe
  2. Alle AFP.EXE aus dem Speicher entfernen. Am besten durch KILL afp.exe
  3. die 0020er Version aus der Registry entfernen x:\afp\afp.exe /unreg (Den Pfad je nach Installation eingeben)
  4. Die neuen Dateien in das AFP-Verzeichnis entpacken.
  5. Neu Registrieren mit x:\afp\afp.exe /regserver
  6. DCOMCNFG.EXE (unter NT) nochmals starten und die Einträge wie in der Doku beschrieben überprüfen. Es sollte keine Änderung notwendig sein, wenn über die 0020er Version installiert wird. Als User sollte man jedoch nicht den interaktiven User sondern einen spezifizierten User der die entsprechenden Rechte hat angeben.
  7. Rechner komplett neu starten.

Windows 2000

Unter http://www.active-foxpro-pages.de/new/afp_doku_neu/install_win2000.htm gibt es eine ausführliche Anleitung hierzu. Der gegenüber NT geänderte Part ist die DCOM-Konfiguration.


Windows 2000 - DCOM

1. Um DCOM zum Laufen zu bekommen muß das Kästchen "enable distributed com on this computer " ausgeschaltet werden (kein Schreibfehler !!!)

An die Einstellung kommt man, wenn "DCOMCNFG.EXE" aufgerufen wird über Startmenü/Ausführen. Auf der Seite Standardeigenschaften (Default Propertys) ist dies der erste Eintrag

2. Lokale Berechtigungen müssen für die Domain festgelegt werden (nicht von der Default-Domain abgeleitete).

Lokale Domain-Berechtigungen sollten bereits für den interaktiven User bzw. Start-User festgelegt werden. Diese Einstellungen kann man vornehmen, wenn im Explorer mit der rechten Maustaste das Webverzeichnis angewählt wird - dort Eigenschaften gewählt wird, dann in der Seite Sicherheitseinstellungen die Option "vererbbare übergeordnete Berechtigungen übernehmen anwählen. (Inherit rights)

3. Um ISAPI-Anwendungen (AFP,...) davon abzuhalten andere Web-Anwendungen im Fehlerfalle zu stoppen müssen diese in "High (Isolated) application protection" Level laufen. Alle anderen Websites können im "normal medium (pooled)" Modus arbeiten.

Diese Option findet sich unter Verwaltung -> Internet Informationsdienste. Rechte Maustaste auf das Webverzeichnis -> Einstellungen -> Basisverzeichnis. Mit der Combobox "Anwendungsschutz" kann der Schutz eingestellt werden.

 


F: Was kann ich tun um die AFP-Spezifische Sicherheit meines Webservers zu erhöhen


3. Parameterübergabe & Cookies

F: Wie übergebe ich Formularinhalte an ein AFP-Programm ?

Aufrufende AFP oder HTML-Seite:

<form method="POST" name="answer" action="neueseite.afp?!<%?fox.ccookie%>">
<input type="text" name="text">
<input type="submit" name="B1" value="Übergeben">
</form>

Empfangende AFP-Seite:

<%
lcText=fox.getformvar("text")
%>

Achtung: Bei Formularfeldnamen und der nachfolgenden Abfrage ist auf Groß- und Kleinschreibung zu achten !


F: Wie rufe ich ein AFP-Programm mit einem Parameter per Link auf ?

Aufrufende AFP-Seite:

<%lcParameter="HALLO"%>
<a href="neueseite.afp?!<%?fox.ccookie%>&parameter=<%?lcParameter%>">

Empfangende AFP-Seite:

<%
lcParameter=""
lcParameter=fox.getpar("parameter")
IF !EMPTY(lcParameter)
? lcParameter
ENDIF
%>

Achtung: Ein einfaches Print der Übergabe dient hier nur als Beispiel - ein Hacker könnte mit ungeprüften Ausgaben relativ viel Schaden anrichten !


F: Wie setze ich einen HTTP-Cookie ?


F: Wie lese ich einen HTTP-Cookie wieder aus ?


F: Wie erstelle ich WAP-Seiten mit den AFP's ?

Wap seiten müssen immer die Endung .WML besitzen, hierfür muß für die .WML-Endung die AFP gemappt werden (Scriptmapping):

Je nach Webserver muß der MIME-Dateitype für WML zusätzlich eingetragen werden in "HTTP Headers" (Management Konsole). Extension ".wml", Type: "text/vnd.wap.wml"

zusätzlich muß der WAP-Header in der Application.prg entsprechend gesetzt werden:

fox.cHttpHeader="HTTP/1.1 200 OK" + Chr(13)+Chr(10)+"Accept-Ranges: bytes" + Chr(13)+Chr(10)+[ETag: c01e1858761bc21842]

fox.cContent-Type="Content-Type: text/vnd.wap.wml"

Mögliche Header
:

Typ Endung(en) Header
WML Source .wml text/vnd.wap.wml
Compiliertes WML .wmlc application/vnd.wap.wmlc
WML Script .wmlscript / .wmls text/vnd.wap.wmlscript
Compiliertes WML Script .wmlsc / .wsc application/vnd.wap.wmlscriptc
Wireless Bitmap .wbmp image/vnd.wap.wbmp

Beispielprogramm:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM// DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">
<wml>
<card>
<p>Willkommen<br/>
Heute ist der <%?date()%>
</p>
</card>
</wml>

Siehe auch (WML-Einführung): http://www.wap.de/Wissen/Entwicklung/WML-Einfuehrung/Webserver.html
Deutscher WML Editor: http://www.jan-winkler.de/dev/d_wmle.htm
WAP Kurs: http://www.thozie.de/wap/wmlkurs.htm


Alternative zur dynamischen Generierung: Die statischen WML Seiten werden dynamisch auf dem Server erstellt.

4. Application.prg

Die Application.prg wird für JEDE AFP-Seite aufgerufen, sie sollte deshalb so KURZ wie möglich gehalten werden (weniger als 300 Zeilen).

Die Application.prg hat im allgemeinen folgende Aufgaben:

1. Initialisierung der globalen Variablen

Wichtig: Um die Variablen nicht zu überschreiben ist ein Konstrukt wie das folgende zu wählen - ansonsten würden diese bei jedem neuen Seitenaufruf gelöscht.

IF TYPE("gcVariable")#"C"
gcVariable=""
ENDIF


Tip: Gehen Sie mit Public-Variablen sparsam um. Vergessen Sie nicht, dass diese zwischen den einzelnen Seiten zwischengespeichert und wieder restauriert werden müssen. Ziehen Sie stattdessen lieber Parameterübergabe in Betracht.

1a. Initialisierung der globalen Variablen - Cookie-Timeout

Mit Hilfe des Cookie-Timeouts wird verhindert, daß User einer nachfolgenden Session fälschlicherweise die Variablen der vorhergehenden Session erhalten.

(Technischer Hintergrund: Die AFP speichert Publicvariable zwischen einzelnen Seitenaufrufen in einer Tabelle mit dem Befehl "save to memo wiedasfeldauchimmerheisst all like g*" zwischen und restauriert sie wieder - als Key dient hierbei fox.cCookie. Startet ein neuer Benutzer das AFP-Programm, und erhält ein neues fox.cCookie.so wird dieser, da hierfür noch kein Eintrag gespeichert ist und in Wirklichkeit sich alle Anwender unter Umständen nur eine FoxPro-Session teilen, die Variablen des letzten Users erhalten. Deswegen ist es UNBEDINGT notwendig, nach einem Cookie-Timeout allen globalen Variablen ihren Standardwert zuzuweisen.)

* Cookie-Timeout
IF fox.lnewcookie
  * Ein User hat entweder das Programm zum erstenmal
  * gestartet oder seine Zeit ist abgelaufen.
  * Gaaanz wichtig! Wichtige Variable müssen hier
  * zurückgesetzt werden.
   gnIrgendeinevariable = 0
   gcIrgendeinstring = ""
   IF not inlist(upper(fox.cForm1 ), "DEFAULT.AFP", "QRY_", "PORTAL_")
      fox.call = "default.afp"
      RETURN .t.
   ENDIF
ENDIF


2. Globale Einstellungen

Hier werden globale Einstellungen vorgenommen...
(Set Einstellungen besser jedoch in AFPINIT.PRG !)


3. Tabellen öffnen

 

 


5. Inhalt des AFP-Verzeichnisses

Die wichtigsten Dateien des AFP - Verzeichnisses:

  errors.dbf Datenbank der Programmfehler - Sollte auf installierten Produktivsystemen gelegentlich durchgesehen werden, um bisher unentdeckte Programmierfehler zu finden
  afpcomp.exe Programm zum Compilieren aller zuvor besuchten AFP-Seiten
cmd.err - enthält den letzten Compilierfehler
  afpinit.prg

Befehle die beim Start einer AFP-Instanz geladen werden afpinit.fxp - mit VFP Compilierte Version (diese Version wird ausgeführt !) Hier sollten globale Einstellungen (SET DATE GERMAN etc.)
vorgenommen werden (und nicht in der Application.prg)

Wird bei jedem Start der afp.exe ausgeführt (Achtung: Eine AFP.EXE handelt u.U. mehrere Webs und mehrere Requests bevor sie den Speicher wieder verlässt - hier also nichts Applikationsspezifisches einfügen).

  afphook.prg Prozedur, die Funktionen enthält die aus jeder AFP Seite
aufgerufen werden können (afphook ist mit set proc an jede
Seite gebunden).
  afphook.fxp mit VFP Compilierte Version (diese Version wird ausgeführt !)
  visitor.dbf Von AFPHOOK.PRG gefüllte Tabelle der Besucher
  access.dbf Von AFPHOOK.PRG gefüllte Tabelle der User & IP-Adressen
  brinfo.dbf Von AFPHOOK.PRG gefüllte Tabelle der Browser & User
  browser.dbf Von AFPHOOK.PRG gefüllte Tabelle
  cookie.dbf Tabelle der Fox-Cookies (zur Restaurierung der globalen Variablen)
  repository.dbf Repository enthält alle besuchten AFP Seiten
(bei Fehlern hilft teilweise ein USE REPOSITORY, ZAP)

cname - Name & Pfad des AFP-Dokuments
ftime - Erstell-Zeit
fdate - Erstell-Datum
prog - Programmcode in VFP übersetzt
memoarray - ?
original - Original AFP-Seite
precomp - Compilierter Code der Seite
last - Datum/Zeit - Bedeutung ?
  afp.ini AFP Einstellungen (durch Programm eingestellt)
  afpsetting.exe Programm zum einstellen der Parameter in afp.ini
  afplic.fxp Lizenzfile
  wwipstuff.dll Mail dll
  langfile.dbf Automatische Übersetzungstabelle
  afpconvert.dbf Umlaut-Umsetzungstabelle für HTML
  timestmp.log AFP Zugriffe protokolliert
  afpnofile.htm Default-HTML Seite für "Keine Datei angegeben"
  afpnotfound.htm Default-HTML Seite für "Datei nicht gefunden"

Achtung: Wenn ein Backup von CD eingespielt wird, darauf achten, daß die Dateien nicht schreibgeschützt sind ! <neu 23.09.2002>

6. AFP.INI

Hier einige wichtige Parameter der AFP.INI

[DEBUG]
; Debugmode an oder aus
MODE=ON

- Nur in der Entwicklung sinnvoll, übergaben werden protokolliert !

; Soll automatisch immer alle Seiten neu komiliert werden
; macht nur im Debugmode einen Sinn
RECOMPILE=OFF


[MEMORY]
CACHE=1256000
; Vordergrund und Hintergrund Cache von VFP

- Cache möglichst erhöhen, je nach System


[FOX-UTIL]
; Soll automatisch ein Close Data All ausgeführt werden,
; nachdem die Seite abgearbeitet ist ?
CLOSEALL=OFF

- möglichst nicht anstellen, da dieses die AFP's stark verlangsamt


; Übersetzungsengine eingeschalten ?
LOCALIZE=ON
- Geschmackssache, verlangsamt die AFP's merklich


; AFP nach jedem Aufruf im Speicher halten ?
KEEPALIVE=ON
- sollte an bleiben, da sonst langsamer

; Bei ON wird das Repository nur noch für den HTML-Code verwendet.
; AFP-Seiten werden nicht mehr benötigt.
FXPONLY=OFF
- wichtig, wenn der Sourcecode nicht mit ausgeliefert werden soll.



7. Codesamples

a.) E-Mail

LPARAMETERS tcFromEmail, tcFromName, tcTo, tcCc, tcBCC, tcSubject,
tcMessage, tcAttachment
DECLARE integer SendMail IN "C:\afp\wwipstuff.dll" ;
STRING cFrom, ;
STRING cFromName, ;
STRING cTo, ;
STRING cCC, ;
STRING cBCC, ;
STRING cSubject, ;
STRING cMessage, ;
STRING cAttachment,;
STRING cMailHost,;
STRING @cError,;
STRING cContentType
lcError = SPACE(513)
lnresult = SendMail( tcFromEmail, tcFromName, tcTo, tcCc, ;
tcBCC, tcSubject, tcMessage, tcAttachment, ;
"mail.IHRSERVER.de" , @lcError , "text/plain")

Bitte Setzen Sie ihren Mailserver in die Funktion ein. Weitere Informationen sowie die Entwicklerlizenz von wwIpStuff erhalten Sie bei www.west-wind.com

F: Meine E-Mail funktioniert nicht - warum ?


b.) Browser-Parameter und IP-Adresse etc. auslesen

? alltrim(fox.read("AFP","Remote Address","")) && IP Adresse
? alltrim(fox.read("AFP","Request Protocol","")) &&
? alltrim(fox.read("ALL_HTTP","HTTP_ACCEPT","")) &&
? alltrim(fox.read("ALL_HTTP","HTTP_ACCEPT_LANGUAGE","")) && Sprache (de,en,..)
? alltrim(fox.read("ALL_HTTP","HTTP_CONNECTION","")) &&
? alltrim(fox.read("ALL_HTTP","HTTP_HOST","")) &&
? alltrim(fox.read("ALL_HTTP","HTTP_REFERER","")) && Herkunfts-URL
? alltrim(fox.read("ALL_HTTP","HTTP_USER_AGENT","")) && Browser
? alltrim(fox.read("ALL_HTTP","HTTP_CONTENT_LENGTH","")) && Länge
? alltrim(fox.read("ALL_HTTP","HTTP_CONTENT_TYPE","")) && Typ
? alltrim(fox.read("ALL_HTTP","HTTP_ACCEPT_ENCODING","")) && Angenommene Dokum.


c.) HTTP-Header ändern (RFC 2068)

fox.chttpheader="HTTP/1.0 200OK"
fox.ccontenttype="Content-type: text/html"

Hier kann z.B. der Content-type csv o.ä. übergeben werden, wodurch z.B. direkt eine Tabellenkalkulation gestartet werden könnte. (Achtung mit Netscape 6, siehe unten !)


d. Feststellen, ob die aktuelle Seite im Compilierten Modus betrieben wird

<% select repository
if empty(precomp)=.t.
?"Ich bin nicht compiliert und wurde am "
?ftime
?"-"
?fdate
?"geändert"
else
?"Ich laufe compiliert"
endif
%>


e.) Faxen über ein E-Mail Gateway mit dem Mabry E-Mail Control (www.mabry.com)

 
***--- Programm AutoFaxPD.prg
***--- Gebastelt von Ralph Rutschmann, Stuttgart, August 2000
***--- Geändert von Ralph Rutschmann, Stuttgart, Dezember 2000
***--- Angepasst für die Freigabe als Public Domain 
***--- von Ralph Rutschmann, Stuttgart, Januar 2001
***--- Formatierung auf 72 Zeichen Zeilenbreite S.Freitag Januar 2001

***--- Beispiel für die Übertragung von Informationen über E-Mail to Fax
***--- Vorbedingung ist ein Account bei z.B. Strato, der einen Messaging Service
***--- umfasst, sowie die Installation des Mabry Mail Controls,
***--- erhältlich unter www.mabry.com

***--- Das Teil ist preisgünstig, arbeitet zuverlässig und liefert,
***--- wenn nötig, einen ganzen Haufen Fehlermeldungen.
***--- Nein, Provision bekomme ich von Mabry keine und auch nicht von Strato. ;-)

***--- Im Original wird die AFP von Peter Herzog eingesetzt und läuft
***--- auf einer Website im Internet, von der Besucher sich Informationen
***--- per E-Mail als auch per Fax zustellen lassen können.
***--- Diese Version ist zur Freigabe abgeändert auf reinen Betrieb unter VFP.

***--- Der von mir, Ralph Rutschmann, geschriebene Code ist ab sofort 
***--- Public Domain, d.h. jeder darf davon verwenden, was und wie er will,
***--- sofern folgende Vereinbarung akzeptiert wird:

***--- Eine wie auch immer geartete Haftung ist ausgeschlossen,
***--- eine wie auch immer geartete Garantie wird nicht übernommen.

***---
***--- BoP (Begin of Program) AutoFaxPD
***---


***--- OLE-Objekt einschalten, ggf. vorhandene Einstellungen speichern
IF !SET("oleobject") == "ON"
	SET OLEOBJECT ON
ENDIF

***--- locale Fax-Variablen deklarieren
LOCAL email, fullname, logonname, passwort, HOST, sender, content, subject,;
      messagetext, empf_name

***--- MabryMail als Object oMailToFax erzeugen
oMailToFax = CREATEOBJECT('Mabry.Mailctrl')
IF TYPE('oMailToFax') = 'O'
	***--- entsprechende Fax-Variablen für Login und Header mit Werten füllen
	m.logonname = "LogOnNameBeiStrato"						
	&& muß jeder selbst einrichten

	m.passwort = "PasswortFürMessagingCenter"					
	&& muß auch jeder selbst einrichten

	m.host = "mail.profimail.de"							
	&& so heißt das bei Strato

	m.sender = "DomainNameBeiStrato@profimail.de"				
	&& auch hier: ab @ bei Strato

	m.content = "Kontaktinformationen von der Bus-Boerse!"		
	&& Beschreibung für den Inhalt der Mail bzw. des Faxes

	***--- MabryMail-Objekteigenschaften bestücken
	oMailToFax.logonname = m.logonname
	oMailToFax.LogonPassword = m.passwort
	oMailToFax.HOST = m.host
	oMailToFax.ContentDescription = m.content

	***--- ggf. vorhandene Fehlerbehandlung sichern
	lcerror = ON('error')
	llerror = .F.
	ON ERROR llerror = .T.

	***--- MabryMail-Objekteigenschaften setzen
	oMailToFax.Blocking = .T.			
	&& Rückgabe der Kontrolle ans aufrufende Programm erst nach 
	&& erfolgter Abarbeitung
	
	oMailToFax.Timeout = 30				
	&& Zeit in Sekunden

	***connect to pop3-server
	oMailToFax.ConnectType = 1			
	&& 0 = connect to SMTP Server
	&& 1 = connect to POP3 Server
	&& 2 = connect to ESMTP Server

	oMailToFax.AuthenticationType = 1	
	&& 0 = none, 1 = auth login
	
	oMailToFax.Connect()			
	&& Strato verlangt die Authentifizierung mittels Passwort. 
	&& Es ist also nötig, sich erst beim gleichnamigen POP3-Server 
	&& einzuloggen, um einen "Kanal" zu öffnen.

	oMailToFax.Disconnect()				
	&& Verbindung beenden, da eigentlich unnötig, führt sonst 
	&& beim folgenden Connect zum SMTP-Server zur Fehlermeldung.
	
	oMailToFax.ConnectType = 0	
	&& 0 = connect to SMTP Server

	oMailToFax.Connect()

	IF !llerror
		m.lcUserID = "IrgendWasOderSo"
		m.empf_name = "IrgendWerOderWas"	&& Achtung: KEINE UMLAUTE!

		***---
		***---
		***--- Daten für Faxübertragung mittels MabryMail 
        ***--- werden ab hier vorbereitet!
		***---
		***---

		***--- entsprechende Fax-Variablen für Empfänger und
        ***--- Message mit Werten füllen, aus Tel. alles rauswerfen 
        ***--- außer Zahlen

		m.email = 497111234567@fax.profimail.de		
            && Achtung: 0049/0711/1234567 wäre die Faxnummer gewesen. 
            && Format beachten! Zum Beispiel so:
			&& 0049     = Vorwahl Deutschland
			&& 0711 	= Vorwahl Stuttgart
            && 1234567  = Faxnummer des Empfängers

		***--- Der Messagetext kann formatiert werden nach Belieben.
		m.fullname = "Ralph Rutschmann"
		m.messagetext = "www.Bus-Boerse.de, Omnibusse mieten und "
        m.messagetext = m.messagetext + "vermieten im Internet!"
        m.messagetext = m.messagetext + CHR(13)+CHR(10)+CHR(13)+CHR(10)
        m.messagetext = m.messagetext + CHR(13)+CHR(10)
		m.messagetext = m.messagetext + "Sehr geehrte(r) " + m.fullname + ", " 
        m.messagetext = m.messagetext + CHR(13) + CHR(10) + CHR(13) + CHR(10)
		m.messagetext = m.messagetext + "hier die neueste Kontaktinformation "
        m.messagetext = m.messagetext + "vom Internetservice Bus-Boerse," 
        m.messagetext = m.messagetext + CHR(13)+CHR(10)
		m.messagetext = m.messagetext + "abgesandt am " + DTOC( DATE() )
        m.messagetext = m.messagetext + " um " + TIME() + " Uhr:" 
        m.messagetext = m.messagetext + CHR(13)+CHR(10)
        m.messagetext = m.messagetext + CHR(13)+CHR(10)
		
		***--- Ergibt z.B. E-Mail-Rückmeldung von GEOFAX1:POSTMASTER über
		***--- korrekt zugestellte Faxe mit dem Betreff:
        ***--- "Reise-ID: '_0130W3W17 an KARIBU REISEN"
		m.subject = "Reise-ID: " + table.cReiseID + " an " + m.empf_name

		***---
		***--- Faxübertragung mittels MabryMail startet hier!
		***---

		***--- create new message, discard old, if any
		oMailToFax.NewMessage()

		***Set header properties
		oMailToFax.To = m.email
		oMailToFax.From = m.sender
		oMailToFax.EMailAddress = ALLTRIM('<'+oMailToFax.From+'>')
		oMailToFax.Headers(oMailToFax.HeadersCount) = ;
                  'X-Mailer: Bus-Boerse'	
		&& Erscheint nur im Header der E-Mail

		oMailToFax.MessageID = ALLTRIM(TTOC(DATETIME())+'_MailToFax')
		&& Muß "eindeutig" sein, wie eindeutig ist leider nicht geregelt.
		&& Es dürfte aber unwahrscheinlich sein, daß zwei E-Mails als
		&& Message-ID's zur selben Sekunde mit dem selben Zusatz
		&& "_MailToFax" erzeugt werden. Man könnte auf Ein-Prozessor-Maschinen
		&& auch einen SYS(2015) verwenden.

		***Subject and text of message
		oMailToFax.subject = m.subject
		oMailToFax.Body(0) = m.messagetext


		***send e-mail message to server
		IF !llerror
			oMailToFax.WriteMessage(64)
			&& 64 = Destination is mail host
		ENDIF


		***--- Prüfen, ob Übertragung erfolgreich verlief ...
		IF oMailToFax.LastError > 0
			* Fehler aufgetreten!
			* WAIT WINDOW "Fehler " + ;
            * STR(oMailToFax.lasterror) + " aufgetreten!"
		ELSE
			* Alles sauber übertragen ...
			* WAIT WINDOW "alles OK, Fehler-Nummer = " +;
            * STR(oMailToFax.LastError) + "!"
		ENDIF
	ENDIF
ENDIF

oMailToFax.Disconnect()				&& Verbindung beenden

***---
***---
***--- Faxübertragung mittels MabryMail endet hier!
***---
***---

***--- MabryMail freigeben
oMailToFax = NULL
RELEASE oMailToFax

***--- Fehlerbehandlung zurücksetzen
ON ERROR &lcerror

***--- locale Fax-Variablen freigeben
RELEASE m.email, m.fullname, m.logonname, m.passwort, m.host, m.sender,;
        m.content, m.subject, m.messagetext, m.empf_name

***--- EoP (End of Program) AutoFax



f.) Webseiten von anderen Servern holen mit wwIpStuff (www.west-wind.com)

  lcUrl="www.dfpug.de"
lcHTML="" oWwip.nConnectTimeout=1 oWwip.HTTPConnect(lcURL) lnResult =oWwip.HTTPGetEx(lcPath,@lcHTML,@lnText,lcHeader) IF lnResult # 0
? "HTTP-GET Fehler :"+oWwip.cErrorMsg
oWwip.HTTPClose()
llRetval=.F.
ELSE
? ALLTRIM(lcHTML)
oWwip.HTTPClose() && Connection schließen
ENDIF

g.) Programmtechnisches Release der AFP.DLL aus dem Speicher in der Application.prg

  IF TYPEnReleaseCounter? # "N"
PUBLIC nReleaseCounter
nReleaseCounter = 1
ELSE
nReleaseCounter = nReleaseCounter + 1
ENDIF
IF nReleaseCounter > 500
FOX.lKeepAlive = .F.
ENDIF

Dadurch wird die AFP.EXE nach dem 500sten Aufruf beendet, der Speicher freigegeben und beim darauffolgenden Aufruf neu gestartet.

8. FOX.Browse

a) Beispiele für Befehle in Fox.Browse

Konditionaler Feldinhalt:

FIELDS=IIF(geschl=1,"Frau","Herrn")|...

Kombination von Strings:

FIELDS=ALLTRIM(vorname)+'&nbsp;'+ALLTRIM(nachname)|...

E-Mail link in der Browse-Liste

FIELDS=<a href="mailto:'+ALLTRIM(email)+'">'+ALLTRIM(email)+'</a>'|...



b) Fox.Browse mit abwechselnden Zeilenmarkierungen

Um abwechselnd farbige Zeilenmarkierungen vorzunehmen bedarf es eines kleinen Tricks.

Da die AFP's beim fox.browse Befehl nur im FIELDS Bereich eine Programmierung zulassen muß hier ein kleiner Umweg gegangen werden.

Die AFP's malen die <tr> und die <td> Anweisungen für jedes Feld im Fields Bereich bereits hin - als erstes muß man sich also des <td> tags und des <tr> tags entledigen, indem man diese Tags schließt:

FIELDS='</td><td></td> .. <td></td></tr>'

Im Mittelteil sind soviele <td></td> paare anzugeben wie Datenbankfelder ausgegeben werden abzüglich des ersten Feldes.

Danach kann man sein eigenes <tr>- (table row, zeile) Tag erstellen:

+'<tr '+IIF(MOD(fox.nAktbrowseline,2)=0,'bgcolor="#FFFFFF"','bgcolor="#DDDDDD"')

Und die Struktur dann entsprechend wieder für das erste Feld aufbauen:

+'><td>'+erstesdatenbankfeld|zweitesdatenbankfeld|drittesdatenbankfeld


Der Trick an dieser Lösung ist, daß Browser leere <td>Ttags nicht darstellen - man also die vorgegebene Zeile leer beendet und neu anfängt. Man könnte auch die schließenden Tags weglassen - allerdings ist das nicht
HTML-konform und funktioniert nur auf IE ab Version 5.x und Netscape ab Version 4.x
.

 

9. AFP - Gotchas

Unter "Gotchas" werden zu vermeidende Fehler zusammengefasst, die einen AFP-Anfänger unter Umständen in die Verzweiflung treiben können. Insbesondere werden hier Abweichungen von der VFP-Sprache betrachtet.


1.) Bindestriche "-" in Dateinamen

Bindestriche in Dateinamen führen zu AFP-Fehlern in der Compilierten Version Dateinamen mit Bindestrichen sind unbedingt zu vermeiden !


2.) Undeklarierte Variablen / Variablenzuweisung in Konstrukten

Variablen die in einem Konstrukt (z.B. IF ... ENDIF) deklariert werden, zuvor aber nicht definiert wurden sind außerhalb dieses Konstrukts nicht mehr sichtbar !

Ebenfalls funktioniert aus diesem Grund:

REPLACE yourdb.feld WITH fox.getformvar("cFeld")

nicht, und muß in 2 Teile aufgesplittet werden:

lcTemp=fox.getformvar("cFeld")
REPLACE yourdb.feld WITH lcTemp

3.) Globale Variable mit falschem Buchstaben

Globale Variable müssen IMMER mit "g" beginnen !


4.) Datensatzpointer / Variable / Cursor

Nach dem Aufruf einer neuen AFP-Seite ist weder der Datensatz noch der Cursor der vorhergehenden Seite weiter vorhanden bzw. gültig. Das einzige was an eine neue AFP Seite übergeben wird sind die globalen Variablen, eventuelle Parameter und Formularinhalte. Speichern Sie also ggf. den Key des Datensatzes in einer globalen Variablen. Dies gilt ebenfalls für den Aufruf einer neuen Seite mittels fox.call



5.) Fox.ccookie

Wenn Sie Fox.ccookie nicht übergeben, können die AFP's die globalen Variablen nicht wieder herstellen. Dieses fällt beim Testen in einem Einplatzsystem eventuell nicht auf - im Mehruserbetrieb erhält die neue Seite im ungünstigsten Fall die Variablen einer anderen Session / eines anderen Besuchers.


6.) AFP-Version bei verteilten Systemen

Achten Sie darauf, dass Sie auf allen Systemen, auf denen Ihr Programm läuft, die gleiche und aktuellste AFP-Version haben, sonst können Sie ein korrektes Funktionieren nicht gewährleisten!


7.) Schleifen

Vermeiden Sie Schleifen die "endlos" laufen können - bedenken Sie immer eine Fehler-Abbruchbedingung. (Die AFP's laufen sonst ohne Fehlermeldung)


8.) Rekursion

Rekursive Programmaufrufe möglichst vermeiden (insbesondere in der Application.prg)


9.) Cookie-Timeout

Denken Sie bitte unbedingt daran, nach der Cookietimeout-Abfrage in Application.prg wichtigen Variablen erneut einen Standardwert zuzuweisen. Andernfalls behalten diese den Wert, den sie beim letzten Benutzer hatten.
Die AFP's machen in dem Bereich keine Garbage-Collection, da der Zeitpunkt des Verlassens der Website durch den User nicht bestimmt werden kann.


10.) Netscape 6 / Mozilla

Die Version 6 von Netscape nimmt es mit den RFC´s wortwörtlich und verzeiht keine fehlenden Leerzeichen oder Falschschreibung von Ausdrücken (Groß und Kleinschreibung) Fügen Sie bitte folgende zeilen in Ihre application.prg ein (bitte in jedem Unterverzeichnis)

fox.ccontenttype="Content-Type: text/html"
fox.chttpheader="HTTP/1.0 200 OK"


11.) Windows 9x und Frames

In Windows 9x wird durch das nicht preemptive Multitasking bzw. durch Fehler im PWS nicht immer der richtige Frameinhalt compiliert und dargestellt. Durch mehrmaliges Reload kann aber meist der gewünschte Anblick getestet werden. Für Produktivsysteme kann Win9x nicht empfohlen werden.


12.) 64K Grenze

Wenn ein sehr Langes HTML-Dokument einen AFP-Block >64K (eingeschlossen durch %> ... <% oder durch <% ... %>) enthält, führt dies zu einem Fehler. Dieses kann umgangen werden, indem in dem Block z.B. ein <%a=1%> eingefügt wird. Allerdings sind IF-Konstrukte mit mehr als 64 k zwischen IF und ENDIF ebenfalls nicht möglich.


13.) =BEFEHL() schreibt auf den Bildschirm

Um eine gewisse Kompatibilität mit den ASP's zu erzeugen wurde dies so programmiert. Weisen Sie eine Variable zu, oder lassen Sie das "=" weg.


14.) Compilierung beschleunigt nicht die Seiten / Dateien werden nicht compiliert

Sie müssen die zu compilierenden Seiten zuvor einmalig besucht haben, damit die AFP's diese in der Datenbank repository.dbf aufnehmen kann.


15.) fox.call die 1.

Eine durch fox.call aufgerufene Routine sollte immer .T. als Wert zurückgeben


16.) SET EXCLUSIVE ON

Der Default von VFP ist "ON", was den gleichzeitigen Zugriff zweier Instanzen unmöglich macht - der Default der AFP's ist auf OFF und sollte auf keinen Fall umgestellt werden.


17.) fox.lerror

fox.lerror muß nach einem fox.ofoxdo.doit stets wieder auf .f. gesetzt werden, da sonst die AFP-Fehlerbehandlung anspringt.


18.) ES IST EIN AFP-FEHLER AUFGETRETEN DER NICHT AUTOMATISCH ABGEFANGEN WERDEN KONNTE ...

Dieses weist meist auf einen Programmierfehler oder einen Fehler der Strukturen hin, selten auf einen Fehler der AFP's

Mögliche Ursachen:
- Versuch eine Datenbank in einem Verzeichnis zu öffnen, das nicht existiert
- Fehlerhafte Datenbank (z.B. durch fehlerhaften Upload)

- Fehlerhaftes Repository


19.) Datumszugriffe

Das von der DATE() funktion zurückgelieferte Datum ist abhängig vom Browser des Betrachters. Dies ist insbesondere für Datumsabfragen nicht sinnvoll.

Durch DTOC(DATE(),1) kann aber stets ein normalisierter String zurückgeliefert werden.

Ein deutsches Datumsformat (unabhängig vom Besucher) kann z.B. wie folgt erzeugt werden:

lcDatum=DTOC(DATE(),1)
lcDatum=RIGHT(lcDatum,2)+"."+SUBSTR(lcDatum,5,2)+"."+LEFT(lcDatum,4)
? lcDatum


20.) Session ID's und Dual-Prozessoren

Bei schnellen Dual-Prozessoren und Clusternetzwerken kann die Generierung des AFP-Cookies mit der SYS(2015) Funktion von Foxpro identische Werte für 2 verschiedene Sessions liefern. Um dies zu umgehen kann eine alternative Session-ID generiert werden:

SYS(0) + _VFP.ProcessId + sys(2015)

SYS(0) =Rechnername
_VFP.ProcessId = Prozess-ID
SYS(2015) = "eindeutiger" Schlüssel

unter Umständen kann auch die IP-Nummer des Callers für eigene Sessions verwendet werden, zu bedenken ist aber daß dies für Rechner hinter Firewalls nicht eindeutig sein kann.


21.) Probleme mit DLLHOST.exe auf W2K Systemen (oder mtx.exe auf NT/IIS4 Systemen)

Unter Umständen verbraucht die DLLHOSTS.EXE unverhältnismäßig viel Arbeitsspeicher und Prozessorzeit. Dieses ist ein von den AFP unabhängiges Problem der IIS-ISAPI. Ein DLLHost gehört zu den IIS Websites, die mit "Mittleren Schutz" laufen. Sofern Seiten als Anwendungsschutz "Hoch" laufen, erhält jede einzelne IIS-Website einen eigenen DLLHost-Prozess.

Mögliche Ursachen für dieses Problem:

Work-Around, wenn der Fehler nicht beseitigbar / findbar ist:


22.) AFP-Fehlermeldung über einen Fehler "docookie".

Der docookie -Fehler ist zu 99,9 % auf eine defekte Cookie-Tabelle zurückzuführen. Behebung des Fehlers: Löschen und Neuaufbau der cookie.* -Dateien im AFP-Verzeichnis mit Visual Foxpro, oder neueinspielen einer leeren Cookie-Datei.


23.) Die Demos der englischen Version 2.4.5 laufen nicht.

Das Verzeichnis DATA muß eingespielt werden - die Demos müssen in das aktuelle Web eingespielt werden (ist dies nicht c:\inetpub\wwwroot, so müssen die Dateien von Hand in das aktuelle Web kopiert werden).


24.) Das Programm KILALL.BAT der AFP's der Installation 2.4.5 läuft nicht

Das Programm läuft nur im AFP-Verzeichnis, da es nicht die Pfade enthält. Lösung: Das Programm mit einem Editor anpassen auf absolute Pfade.


25.) Programme erscheinen als nicht compiliert (für AFP Version vor 2.4.6)

Bei der Umstellung von Winter- auf Sommerzeit und umgekehrt muß AFPCOMP.EXE zum compilieren aufgerufen werden. Dies ist ein Problem mit den Timestamps in der AFP-Repository.


26.) fox.call die 2.

Die Anwendung des Aufrufs fox.CALL bringt zwar Vorteile, da die Kommunikation über das Web vermindert wird. Dies birgt allerdings auch eine Gefahr, dessen man sich bei der Anwendung bewusst sein sollte:

Dadurch dass die Rückantwort an den Browser unterbunden wird und die Antwirt einer anderen Page als der aufgerufenen übermittelt wird, steht im location – Object nach wie vor die URL der Seite mit dem fox.Call – Befehl. Wird nun Reload gedrückt, wird nicht die dargestellte Seite aufgerufen, sondern nochmals die Seite mit dem fox.CALL – Befehl.

Dies führt beispielsweise dazu, dass das Formular, das die Speicherungs-afp aufruft und anschliessend über fox.CALL auf eine weitere Seite verzweigt, ein zweites Mal aufgerufen wird und so möglicherweise zweimal gespeichert wird.


27) Opera und ältere AFP Versionen <2.4.5

Unter älteren AFP-Versionen gibt es Anzeigeprobleme mit Opera (dies Problem hat Opera aufgrund anders strukturierter HTTP-Requests mit vielen ISAPI-Anwendungen) - die AFP Version 2.4.5 behebt die Probleme)


28.) Probleme mit COM-Komponenten unter Windows 2000

Servicepack 2 behebt einige Probleme mit COM-Komponenten: http://support.microsoft.com/support/kb/articles/Q276/3/96.ASP

 


29.) Probleme mit Pfaden im IIS-Manager

Pfade mit langen Dateinamen und Leerzeichen können (selten) beim IIS zu Problemen führen - ist dies der Fall, so sollte der Pfad in der 8.3 Kurzschreibweise angegeben werden C:\Progra~1\Common~1\...


10. AFP Undokumentierte Tricks

F: Gibt es undokumentierte Aufrufparameter ?

F: Wie werden Formularinhalte getrennt ?

11. Testen von AFP Anwendungen / Styleguides / Tuning

Testen

1. Beim Debuggen einer Webanwendung kann man graue Haare kriegen. Versuchen Sie deswegen, soviel Foxpro-Code wie möglich in Funktionen auszulagern und in die AFP-Seiten nur die Funktionsaufrufe einzubinden. Dadurch können Sie die VFP-Entwicklungsumgebung zum Debuggen benutzen. Ausserdem gerät der AFP-Code so übersichtlicher.

2. Gestalten Sie Ihre Abfragen so effektiv wie nur möglich. Denken Sie immer daran, dass jemand Ihr Programm "totklicken" könnte. Auch wenn Ihre Abfragen bei 10 gleichzeitigen "vernünftigen" Benutzern blitzschnell funktionieren, bedeutet das nicht, dass Sie in der Praxis keine Probleme haben werden.

3. Benutzen Sie "status.afp/status", um die Abfragezeiten zu messen. Klicken Sie mehrere Minuten lang so schnell wie möglich auf diverse Hyperlinks, die Abfragen ausführen. Gewährleisten Sie anschliessen durch "status.afp/status", dass alle Instanzen wieder den Status "Idle" haben. Gewährleisten Sie weiterhin, dass Sie
nicht mehr als 1 maximal 2 Instanzen beschäftigt haben und dass die durchschnittliche Abfragezeit unter 1 Sekunde gelegen hat.

4. Bitten Sie jemand, der sich damit auskennt, ein paar "Attacken" gegen Ihr Programm zu fahren. (z.B. mit Mass-Download Tools)


Tuning

1. Deaktivieren Sie "afphook.prg", indem Sie die bestehende Datei umbenennen, und eine Leere Datei die nur ein RETURN enthält erstellen. Es ist als Beispiel interessant, generiert aber zuviel Datenmüll. (Compilieren nicht vergessen !)

2. Programmieren Sie wie zu FoxBase-Zeiten! Ein Seek ist VIEL schneller als ein LOCATE ! Fragen Sie in Ihren SQL-Abfragen nur die Schlüsselfelder ab und platzieren Sie sich anschliessend per "Seek" auf den dazugehörigen Datensätzen. Falls sie Tabellen von einem anderen Computer abfragen, sollten sie in Betracht ziehen, statische Tabellen lokal zu halten, um das Netzwerk zu entlasten.

3. Experimentieren Sie mit der Seitenlänge. Lange Seiten sind unkomfortabel, beschäftigen die AFP länger als notwendig und haben längere Ladezeiten. Benutzen Sie eine Kontrollstruktur zur Anzeige, falls eine Seite viele Datensätze anzeigen soll.

4. Gehen Sie mit Public-Variablen sparsam um. Vergessen Sie nicht, dass diese zwischen den einzelnen Seiten zwischengespeichert und wieder restauriert werden müssen. Ziehen Sie stattdessen lieber Parameterübergabe in Betracht.


Allgemeines zum IIS und AFP-Instanzen

IIS verwaltet eine Warteschlange für Anfragen. Bei IIS 5 ist die standardmäßig 3000 Einträge groß, bei IIS 4 waren es 500. Wenn mehr als diese Anzahl an Anfragen eintrifft und unbeantwortet bleibt, meldet IIS einen "Server too busy" Fehler zurück.

Der nächste Schritt ist die Anzahl der Worker Threads, auf die IIS die Anfragen verteilt, und in denen die AFP.DLL arbeitet. Diese Threads werden dynamisch von IIS erzeugt, wobei die CPU Auslastung als wichtigstes Merkmal genutzt wird. Bei niedriger Auslastung gibt es mehr Threads, bei hoher Auslastung werden Threads gekillt. Der Standardwert ist 10, mehr als 63 habe ich bei mir noch nicht gesehen. Wenn die Threads ausgelastet sind, wartet IIS. Der Anwender merkt da also gar nichts.

Die AFP.DLL verwaltet eine Liste von AFP.EXE Objekten. Jeder Thread wartet eine gewisse Zeit, ob eine AFP.EXE frei wird. Dies ist der "busytimeout" aus der .INI Datei, der in der ausgelieferten .INI Datei bei 30 Sekunden liegt. Wenn in der Zeit keine AFP.EXE frei wird, dann wird eine Fehlermeldung "timed out xx secs" ausgegeben bzw. die vorhandene AFP Error HTML Datei zurückgesendet (wenn Du eine angegeben hast).

Mehr Instanzen bedeutet im allgemeinen eine größere Belastung für den Server. Außerdem wird die Antwortzeit verlängert. Hast Du etwa eine Abfrage, die 5 Sekunden dauert und nur eine Instanz, dann muß der zweite Anwender 10 Sekunden warten (5 bis der erste fertig ist und 5 für seine eigene), der dritte 15, usw. Mit mehreren Instanzen verteilt sich die Zeit nun auf die einzelnen Threads. Bei 10 Instanzen bekommt etwa jede Instanz nur noch 1/10 der Zeit. Die Abfrage dauert nun nicht mehr 5 Sekunden, sondern 50 Sekunden, das aber gleichmäßig verteilt. Jeder Anwender bekommt dann die Antwort nach der gleichen Zeit. Wenn zu viele Instanzen parallel laufen, ist der Anwender geneigt, öfter mal F5 zu drücken (Aktualisieren im Browser). Jedes F5 bedeutet eine weitere Abfrage für die AFP. Bei mehreren CPUs verteilen sich die Anwendungen natürlich entsprechend.

Der Sinn von mehreren Instanzen ist es, bei unterschiedlich langen Anforderungen eine bessere Reaktionszeit zu bieten. Wenn mit einer Instanz ein Anwender eine Abfrage ausführt, die 10 Sekunden dauert, sind alle anderen blockiert. Wenn mehrere Instanzen zur Verfügung stehen und die meisten Anfragen nur 300 ms dauern, dann würde sich das zwar auf 600 ms (2 Instanzen) oder gar 3 Sekunden (10 Instanzen) erhöhen, aber das ist immer noch schneller als die 10 Sekunden bei einer Instanz.

Anhang A: Wo gibt es Sample-Codes zu den AFP's ?

1. Kostenlose Samples

2. Kostenpflichtige Samples & Anwendungen

... Sie kennen eine weitere Anwendung ? -> afpfaq <at> sfsd.de


Anhang B: Welche Firmen bieten AFP-Programmierung an ?



Fa. Prolib
Tel.:08667/888321
Fax: 08667/888328
E-Mail: info<at>prolib.de
WWW: www.prolib.de

Fa. Ing.Büro Jürgen Mayer
Tel.: 07151 906044
Fax: 07151 906045
E-Mail: mayer<at>db-server.de
WWW: www.db-server.de

Fa. Sönke Freitag Softwaredesign
Tel.: 040 5601594
Fax: 040 562927
E-Mail: kontakt <at> sfsd.de
WWW: www.sfsd.de, www.viaonline.de , www.afp-hosting.de
Post: Eilenau 69a, 22089 Hamburg

Fa. P.Herzog
E-Mail: admin<at>pherzog.de
WWW: www.pherzog.de

Fa. Ralf J. Schlaefer, INTERNETCONSULTING & DATABASE SOLUTIONS <geändert 21.01.2003>
Tel: 0621 727399 30
Fax: 0621 727399 28
E-Mail: info<at>speedbase.de

WWW: www.speedbase.de
Post: Waldpforte 148, D-68305 Mannheim

Fa. Ralph Rutschmann Anwendungsentwicklung
Tel: 0711 2626485
Fax: 0711 2621270
E-Mail: rutschm<at>t-online.de
Post: Libanonstr. 10, 70184 Stuttgart

Fa. Prime DV-Consulting GmbH
Tel.: 02242  9698 - 0
Fax.: 02242  9698 - 299
E-Mail : kraemer<at>prime2000.de
WWW: www.prime2000.de
Post: Humperdinckstr. 14, D-53773 Hennef

Fa. STARFOX Software AG
Tel.: 02242  9698 - 0
Fax.: 02242  9698 - 299
E-Mail : kraemer<at>starfox.de
WWW: www.starfox.de
Post: Humperdinckstr. 14, D-53773 Hennef

Fa. Vogel Software GmbH
Tel.: 09279/9797-0
E-Mail: r.vogel<at>vogel-software.com
WWW: vogel-software.com
Post: Engelmess 28, 95490 Mistelgau

3S System Software Support
Thomas Jakober
Tel: +41 52 366 50 05
Fax: +41 52 366 50 08
E-Mail: tj<at>3sweb.net
WWW: www.3sweb.net
Post: Schulstrasse 28, CH-8546 Gundetswil

rkCOM Netzwerke GmbH <neu 30.03.2003>
Rüdiger Kronenberg

Tel: +49 8042 911 911
Fax: +49 8042 911 912
E-Mail:rudik<at>rkcom.net
WWW: www.rkcom.net
Post: Hohenwiesen 2a , D-83661 Lenggries


... Sie kennen eine weitere Entwicklerfirma ? Bitte Mail an afpfaq<at>sfsd.de