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.

So erstellen Sie ein Projekt mit dem ISAPI-Erweiterungs-Assistenten in Visual Studio

  1. Wählen Sie in der Entwicklungsumgebung aus dem Menü Datei den Befehl Neu, und klicken Sie auf die Registerkarte Projekte.
  2. Klicken Sie in der Registerkarte Projekte auf ISAPI-Erweiterungs-Assistent, und geben Sie einen Projektnamen ein.
  3. Aktivieren Sie in Schritt 1 des ISAPI-Erweiterungs-Assistenten das Kontrollkästchen Server-Erweiterungsobjekt erstellen.
  4. 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

  1. 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.
  2. Schreiben Sie für jede Funktion einen Eintrag in der Analysezuordnung für erforderliche und optionale Parameter.
  3. Ü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

  1. Wählen Sie in der Entwicklungsumgebung aus dem Menü Datei den Befehl Neu, und klicken Sie auf die Registerkarte Projekte.
  2. Klicken Sie in der Registerkarte Projekte auf ISAPI-Erweiterungs-Assistent, und geben Sie einen Projektnamen ein.
  3. Aktivieren Sie in Schritt 1 des ISAPI-Erweiterungs-Assistenten das Kontrollkästchen Filterobjekt erzeugen.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. Klicken Sie auf Beenden, um die ISAPI-Erweiterung zu erstellen.

So fügen Sie die Filterverarbeitung hinzu

  1. Geben Sie die gewünschten Benachrichtigungen in GetFilterVersion an. dwFlags enthalten bereits Filter für Ereignisse, die Sie im Erweiterungs-Assistenten angegeben haben.
  2. 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.
  3. 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.
  4. 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.

©2000 Microsoft Corporation. Alle Rechte vorbehalten. Rechtliche Hinweise.