ISAPI (Internet Server Application Programming Interface)
Unterscheidung zwischen ISAPI und CGI
ISAPI-Server-Erweiterungen können alternativ zu Common Gateway Interface (CGI)-
Anwendungen für Internet Server verwendet werden. Anders als CGI-Anwendungen
werden ISAs (Internet Server-Anwendung) im selben Adreßraum wie der HTTP-Server
ausgeführt und können auf alle Ressourcen zugreifen, die für den HTTP-Server
verfügbar sind. ISAs kommen mit weniger Verwaltungsaufwand als CGI-Anwendungen
aus, da keine Prozesse zusätzlich erstellt werden müssen und keine zeitaufwendige
prozessübergreifende Kommunikation erforderlich ist. Erweiterungen und Filter-DLLs
können entladen werden, wenn der Speicher von einem anderen Prozess benötigt
wird. Ein Internet Client ruft eine ISA durch den HTTP-Server in derselben Weise
auf, in der er eine CGI-Anwendung aufrufen würde. Beispielsweise könnte ein
Client eine CGI- Anwendung wie folgt aufrufen:
http://Beispiel/Beispiel.exe?Param1&Param2
Eine ISA, die dieselbe Funktion ausführt, wird wie folgt aufgerufen:
http://Beispiel/Beispiel.dll?Param1&Param2
ISA (Internet Server-Anwendung) = ISAPI-Server-Erweiterungen
Erlaubt mehrere Befehle in einer DLL, wenn diese als Member-Funktionen des
Objekts CHttpServer in der DLL definiert wurden. CGI verlangt für jede Aufgabe
die separate Namens- und URL-Zuordnung zu einer separaten ausführbaren Datei.
Jede neue CGI-Anforderung startet einen neuen Prozess, und jede unterschiedliche
Anforderung ist in einer eigenen ausführbaren Datei enthalten; diese wird bei
jeder Anforderung geladen und entladen, so daß der Verwaltungsaufwand den von
ISAs übertrifft. Eine ISA wird explizit von einem Client gestartet, der ein
URL sendet, der Ihre DLL aufruft. Beispielsweise fordert http://server/hallo.dll?
den Server „server" auf, die DLL „hallo" auszuführen. Eine HTTP-Anforderung
kann auch gesendet werden, wenn ein Benutzer auf eine Schaltfläche auf einer
Web-Seite klickt. Dieses Verfahren wird oft in Web-Seiten angewendet, die ein
Formular zum Sammeln von Informationen darstellen, die als Parameter an die
DLL übergeben werden. Beispielsweise ruft http://server/NameByValue.dll?getName?value=1
die DLL auf und übergibt den Parameter value=1 an die Funktion getName.
ISAPI-Filter
Besitzen keine CGI-Entsprechung. Filter ermöglichen die Vorbereitung und Nachbereitung
aller Daten, die zwischen Client und Server gesendet werden. Ein ISAPI-Filter
wird jedesmal aufgerufen, wenn ein bestimmtes Ereignis eintritt – unabhängig
davon, welche Anforderung gerade vom Server verarbeitet wird. Ein Filter kann
bei jeder Anforderung an den Server Daten verarbeiten, überprüfen und ändern.
Unterschiede zwischen ISAPI-Server-Erweiterungen und ISAPI- Filter
Eine Server-Erweiterung: |
Ein Filter: |
Wird ausgeführt, wenn in einem URL auf sie verwiesen wird. |
Wird für jeden URL aufgerufen, den der Server verarbeitet. |
Wird explizit aufgerufen, z. B. von http://server/hallo.dll?. |
Wird automatisch für jeden URL ausgeführt, der an den Server gesendet
wird, falls das registrierte Ereignis eintritt. |
Wird bei Bedarf geladen, wenn ein Benutzer sie zum ersten Mal aufruft. |
Wird beim Starten des Dienstes aufgrund des Registrierungseintrags geladen. |
- Server-Erweiterungen und Filter haben folgendes gemeinsam:
- Sie verwenden den Prozessraum des Servers gemeinsam.
- Sie müssen Thread-sicher sein.
- Sie bleiben nach dem Laden permanent im Speicher (bis der Dienst beendet
oder der Speicher von einem anderen Prozess benötigt wird).
So erstellen Sie ein Projekt mit dem ISAPI-Erweiterungs-Assistenten in Visual
Studio
- Wählen Sie in der Entwicklungsumgebung aus dem Menü Datei den Befehl Neu,
und klicken Sie auf die Registerkarte Projekte.
- Klicken Sie in der Registerkarte Projekte auf ISAPI-Erweiterungs-Assistent,
und geben Sie einen Projektnamen ein.
- Aktivieren Sie in Schritt 1 des ISAPI-Erweiterungs-Assistenten das Kontrollkästchen
Server-Erweiterungsobjekt erstellen.
- Geben Sie der von CHttpServer abgeleiteten Erweiterungsklasse einen Namen,
und wählen Sie dann Beenden, um das Projekt zu erstellen
So fügen Sie Funktionen hinzu
- Schreiben Sie für jeden Befehl eine Funktion. MFC übergibt beim Aufrufen
Ihrer Funktion einen Zeiger auf ein CHttpServerContext-Objekt. Die benötigten
Informationen befinden sich überwiegend im EXTENSION_CONTROL_BLOCK-Strukturdatenelement
des Objekts. Sie können mit Member-Funktionen-Rückrufen auch weitere Header-
Informationen erhalten, wie z. B. die IP-Adresse des Benutzers.
- Schreiben Sie für jede Funktion einen Eintrag in der Analysezuordnung für
erforderliche und optionale Parameter.
- Überschreiben Sie CHttpExtensionProc, wenn Sie eine benutzerspezifische
Verarbeitung vorsehen möchten.
So installieren Sie die DLL
Kopieren Sie die DLL in ein Verzeichnis, für das Benutzer Ausführungsberechtigung
besitzen. Für Microsoft Internet Information Server stellen Sie Ausführungsberechtigungen
im Internet-Dienst- Manager ein. Clients können nun die URL im Browser eingeben,
um die DLL auf dem Server aufzurufen.
So erstellen Sie ein Projekt mit dem ISAPI-Erweiterungs-Assistenten mit Visual
Studio
- Wählen Sie in der Entwicklungsumgebung aus dem Menü Datei den Befehl Neu,
und klicken Sie auf die Registerkarte Projekte.
- Klicken Sie in der Registerkarte Projekte auf ISAPI-Erweiterungs-Assistent,
und geben Sie einen Projektnamen ein.
- Aktivieren Sie in Schritt 1 des ISAPI-Erweiterungs-Assistenten das Kontrollkästchen
Filterobjekt erzeugen.
- Geben Sie dem CHttpFilter-Objekt einen Namen, überprüfen Sie, ob die MFC-DLLs
statisch oder dynamisch verknüpft werden sollen, und wählen Sie dann die Schaltfläche
Weiter. Funktion nur in Professional und Enterprise Editionen verfügbar Statische
MFC- Verknüpfungen werden nur in den Visual C++-Professional und Enterprise
Editionen unterstützt. Weitere Informationen finden Sie unter Visual C++-Editionen.
- Wählen Sie in Schritt 2 des ISAPI-Erweiterungs-Assistenten eine Filterbenachrichtigungs-
priorität. Die empfohlene Standard-Benachrichtigungspriorität ist Niedrig.
Andere Benachrichtigungsprioritäten können die Verarbeitungsgeschwindigkeit
und Skalierbarkeit negativ beeinflussen.
- Wählen Sie die Verbindungstypen aus, die Filterbenachrichtigungen auslösen
sollen. Der Filter kann Benachrichtigungen von einem gesicherten Anschluss,
von einem ungesicherten Anschluss oder von beidem empfangen. Der ISAPI-Erweiterungs-Assistent
stellt als Standardwert "Beide" ein.
- Wählen Sie, welche Benachrichtigungen der Filter verarbeiten soll. Eine
Beschreibung der Benachrichtigungsattribute finden Sie unter CHttpFilter::GetFilterVersion,
eine Liste der Funktionen, die Sie überschreiben können, finden Sie unter
Klassenelemente von CHttpFilter. Die im ISAPI-Erweiterungs-Assistenten ausgewählten
Benachrichtigungsfilter werden in Ihr Projekt in der Standardimplementierung
eingeschlossen. Wählen Sie nur Benachrichtigungen aus, die der Filter tatsächlich
behandeln soll. Das Hinzufügen nicht benötigter Benachrichtigungen beeinträchtigt
die Effizienz des Filters. Sie können Benachrichtigungsfunktionen später in
den Projektquelldateien manuell hinzufügen und löschen.
- Klicken Sie auf Beenden, um die ISAPI-Erweiterung zu erstellen.
So fügen Sie die Filterverarbeitung hinzu
- Geben Sie die gewünschten Benachrichtigungen in GetFilterVersion an. dwFlags
enthalten bereits Filter für Ereignisse, die Sie im Erweiterungs-Assistenten
angegeben haben.
- Um eine neue Benachrichtigung hinzuzufügen, fügen Sie das Filterattribut
in CHttpFilter::GetFilterVersion zu dwFlags hinzu. Fügen Sie die Deklaration
der Filterfunktion zur .H-Datei hinzu. Fügen Sie die Filterdefinition zur
.CPP-Datei hinzu. Sie können Benachrichtigungsattribute und -funktionen auch
löschen.
- Um die Filterfunktionen zu implementieren, öffnen Sie die .CPP-Datei und
fügen Sie die benutzerspezifische Behandlung für die ausgewählten Filterbenachrichtigungen
hinzu, indem Sie die //Zu Erledigen-Anweisungen in dem vom Assistenten erzeugten
Code ersetzen.
- Um den Filter zur Registrierung hinzuzufügen, geben Sie den vollständigen
Pfadnamen und den Namen Ihrer DLL an. HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/
FilterDLLs ist der Registrierungsschlüssel, in dem Filter angegeben werden.
Wenn Sie mehrere Einträge angeben, müssen diese durch Kommas voneinander getrennt
werden, und sie werden in der angegebenen Reihenfolge geladen.
So laden Sie den Filter oder installieren eine neue Version unter Microsoft
Internet Information Server
Fahren Sie den WWW-Dienst herunter, kopieren Sie die neue Version Ihrer DLL
über die alte Version, und starten Sie den Dienst neu.
ISAPI: Tips zur Programmierung
Denken Sie stets daran, dass Ihre ISAPI-Anwendung unter NT im Kontext eines
Dienstes ausgeführt wird. Das bedeutet, dass der Code Thread-sicher und ablaufinvariant
sein muss und keine Benutzeroberfläche auf dem Server besitzt.
- Überwachen Sie die Ressourcennutzung. Geben Sie nicht mehr benötigte Ressourcen
frei. Beispielsweise können Sie eine ODBC-Verbindung nicht für die gesamte
Lebenszeit des Servers aufrechterhalten.
- Programmieren Sie Thread-sicher. Schützen Sie Daten mit Hilfe von Synchronisierungsobjekten.
Verwenden Sie keine globalen Variablen.
- Schreiben Sie Filter zur Verwendung der geeigneten Prioritätsbenachrichtigung
auf der niedrigsten möglichen Priorität. Ein Filter, der die Echtheitsbestätigung
der Benutzer überprüft, muss eher mit hoher Priorität ausgeführt werden. Würde
nämlich eine Echtheitsbestätigung fehlschlagen, so würden die anderen Filterbenachrichtigungen
niedriger Priorität niemals aufgerufen.
- Programmieren Sie effiziente Filterverarbeitungsroutinen. Filterfunktionen
können für alle Server-Anforderungen aufgerufen werden, so dass ein ineffizienter
Filter die Verarbeitungsgeschwindigkeit erheblich beeinträchtigen könnte.
Wenn Sie nicht alle ursprünglich definierten Filterbenachrichtigungen verwenden,
ändern Sie dwFlags in GetFilterVersion und löschen Sie nicht benötigte Benachrichtigungen.
- Zeigen Sie auf dem Server keine Dialogfelder an, die ohne Benutzereingriff
und insbesondere ohne Klicken auf OK ausgeführt werden. Protokollieren Sie
statt dessen Fehlerinformationen in einer Protokolldatei oder Datenbank.
©2000 Microsoft
Corporation. Alle Rechte vorbehalten. Rechtliche Hinweise.