Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie Sie mit C++ ein HTTP-Beispielmodul auf globaler Ebene erstellen, das die neue Anforderungsverarbeitungsarchitektur in IIS 7 implementiert. Diese neue Architektur erweitert die Funktionen der systemeigenen Codeprogrammierung, wenn Sie IIS-Anwendungen über frühere Versionen von ASP.NET HTTP-Module und ISAPI-Filter oder Erweiterungen schreiben. Weitere Informationen zum Entwerfen von HTTP-Modulen mithilfe der neuen Anforderungsverarbeitungsarchitektur finden Sie unter Entwerfen Native-Code HTTP-Module.
In dieser exemplarischen Vorgehensweise erstellen Sie ein C++-Projekt für Ihr HTTP-Modul, fügen den erforderlichen Code für ein "Hello World"-Projekt hinzu und kompilieren und testen dann das Modul.
Voraussetzungen
Die folgende Software ist erforderlich, um die Schritte im Beispiel auszuführen:
IIS 7.
Visual Studio 2005.
Hinweis
Sie können auch Visual Studio .NET 2003 oder früher verwenden, obwohl die exemplarischen Vorgehensweisen möglicherweise nicht identisch sind.
Erstellen des Moduls
In diesem Teil der exemplarischen Vorgehensweise erstellen Sie ein leeres C++-DLL-Projekt für Ihr HTTP-Modul.
So erstellen Sie ein neues C++-DLL-Projekt
Starten Sie Visual Studio 2005.
Stellen Sie sicher, dass die globalen Optionen die korrekten Pfade zu den SDK-Headerdateien enthalten.
Klicken Sie im Menü Extras auf Optionen.
Erweitern Sie den Knoten Projekte und Lösungen in der Strukturansicht, und klicken Sie dann auf VC++-Verzeichnisse.
Wählen Sie im Dropdownfeld "Verzeichnisse anzeigen " die Option "Dateien einschließen" aus.
Vergewissern Sie sich, dass der Pfad, in den Sie das SDK installiert haben, die Include-Dateien aufgelistet ist. Wenn der Pfad nicht aufgeführt ist, klicken Sie auf das Symbol Neue Zeile und fügen Sie dann den Pfad hinzu, in dem Sie die SDK-Include-Dateien installiert haben.
Klicke auf OK.
Erstellen eines neuen C++-Projekts:
Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
Das Dialogfeld "Neues Projekt " wird geöffnet.
Erweitern Sie im Bereich "Projekttypen " den Visual C++ -Knoten, und klicken Sie dann auf Win32.
Wählen Sie im Bereich "Vorlagen " "Win32-Projekt" aus.
Geben Sie im Feld "Name " "HelloWorld" ein.
Geben Sie im Feld "Speicherort " den Pfad für das Beispiel ein.
Klicke auf OK.
Der Win32-Anwendungs-Assistent wird geöffnet.
Klicken Sie auf "Anwendungseinstellungen".
Klicken Sie unter "Anwendungstyp" auf "DLL".
Klicken Sie unter "Weitere Optionen" auf "Projekt leeren".
Klicken Sie auf Fertig stellen.
Hinzufügen von Code- und Quelldateien
Der nächste Schritt besteht darin, dem Projekt die erforderlichen C++- und Moduldefinitionsdateien hinzuzufügen.
So fügen Sie dem Projekt die Quelldateien hinzu
Erstellen Sie die Moduldefinitionsdatei zum Exportieren der RegisterModule-Funktion :
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf "Quelldateien", zeigen Sie auf "Hinzufügen", und klicken Sie dann auf "Neues Element".
Das Dialogfeld " Neues Element hinzufügen " wird geöffnet.
Erweitern Sie den Visual C++ -Knoten im Bereich "Kategorien ", und klicken Sie dann auf "Code".
Wählen Sie im Bereich „Vorlagen“ die Vorlage Moduldefinitionsdatei aus.
Geben Sie im Feld "Name"HelloWorld ein, und lassen Sie den Standardpfad für die Datei im Feld "Speicherort" stehen.
Klicken Sie auf Hinzufügen.
Fügen Sie den folgenden Code hinzu:
LIBRARY HelloWorld EXPORTS RegisterModule
Optional können Sie die RegisterModule-Funktion mithilfe des Schalters "/EXPORT:RegisterModule " exportieren:
Klicken Sie im Menü "Projekt " auf "HelloWorld-Eigenschaften".
Erweitern Sie den Knoten "Konfigurationseigenschaften " in der Strukturansicht, erweitern Sie den Linker-Knoten , und klicken Sie dann auf "Befehlszeile".
Wählen Sie im Dropdownfeld "Konfiguration" die Option "Alle Konfigurationen" aus.
Geben Sie im Feld "Zusätzliche Optionen " /EXPORT:RegisterModule ein.
Klicke auf OK.
Erstellen Sie die C++-Datei:
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf "Quelldateien", zeigen Sie auf "Hinzufügen", und klicken Sie dann auf "Neues Element".
Das Dialogfeld " Neues Element hinzufügen " wird geöffnet.
Erweitern Sie den Visual C++ -Knoten im Bereich "Kategorien ", und klicken Sie dann auf "Code".
Wählen Sie im Vorlagenbereich die C++-Dateivorlage aus.
Geben Sie im Feld "Name"HelloWorld ein, und lassen Sie den Standardpfad für die Datei im Feld "Speicherort" stehen.
Klicken Sie auf Hinzufügen.
Fügen Sie den folgenden Code hinzu:
#define _WINSOCKAPI_ #include <windows.h> #include <sal.h> #include <httpserv.h> // Create the module's global class. class MyGlobalModule : public CGlobalModule { public: // Process a GL_APPLICATION_START notification. GLOBAL_NOTIFICATION_STATUS OnGlobalPreBeginRequest( IN IPreBeginRequestProvider * pProvider ) { UNREFERENCED_PARAMETER( pProvider ); WriteEventViewerLog( "Hello World!" ); return GL_NOTIFICATION_CONTINUE; } VOID Terminate() { // Remove the class from memory. delete this; } MyGlobalModule() { // Open a handle to the Event Viewer. m_hEventLog = RegisterEventSource( NULL,"IISADMIN" ); } ~MyGlobalModule() { // Test whether the handle for the Event Viewer is open. if (NULL != m_hEventLog) { // Close the handle to the Event Viewer. DeregisterEventSource( m_hEventLog ); m_hEventLog = NULL; } } private: // Create a handle for the event viewer. HANDLE m_hEventLog; // Define a method that writes to the Event Viewer. BOOL WriteEventViewerLog(LPCSTR szNotification) { // Test whether the handle for the Event Viewer is open. if (NULL != m_hEventLog) { // Write any strings to the Event Viewer and return. return ReportEvent( m_hEventLog, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, &szNotification, NULL ); } return FALSE; } }; // Create the module's exported registration function. HRESULT __stdcall RegisterModule( DWORD dwServerVersion, IHttpModuleRegistrationInfo * pModuleInfo, IHttpServer * pGlobalInfo ) { UNREFERENCED_PARAMETER( dwServerVersion ); UNREFERENCED_PARAMETER( pGlobalInfo ); // Create an instance of the global module class. MyGlobalModule * pGlobalModule = new MyGlobalModule; // Test for an error. if (NULL == pGlobalModule) { return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); } // Set the global notifications and exit. return pModuleInfo->SetGlobalNotifications( pGlobalModule, GL_PRE_BEGIN_REQUEST ); }
Sie können den Code optional mithilfe der
__stdcall (/Gz)aufrufenden Konvention kompilieren:Klicken Sie im Menü "Projekt " auf "HelloWorld-Eigenschaften".
Erweitern Sie den Knoten "Konfigurationseigenschaften " in der Strukturansicht, erweitern Sie den C/C++ -Knoten, und klicken Sie dann auf "Erweitert".
Wählen Sie im Dropdownfeld "Konfiguration" die Option "Alle Konfigurationen" aus.
Wählen Sie im Dropdownfeld " Anrufkonvention " __stdcall (/Gz) aus.
Klicke auf OK.
Kompilieren und Testen des Moduls
Ihr HTTP-Modul verfügt über alles, was es benötigt. Alles, was erforderlich ist, besteht darin, Ihr HTTP-Modul zu kompilieren und zu testen.
So kompilieren und testen Sie das Projekt
Kompilieren des HTTP-Moduls:
Klicken Sie im Menü "Erstellen" auf "Lösung erstellen".
Stellen Sie sicher, dass Visual Studio keine Fehler oder Warnungen zurückgegeben hat. Wenn Fehler oder Warnungen auftreten, müssen Sie diese Probleme beheben, bevor Sie das Projekt testen.
Kopieren Sie die DLL-Datei für das HTTP-Modul in Ihren IIS-Ordner:
Öffnen Sie Windows Explorer, und suchen Sie den Standardordner, der beim Erstellen des C++-Projekts angegeben wurde.
Je nach Buildoptionen sollte ein Ordner mit dem Namen "Debuggen" oder "Release" im Standardordner für Ihr Projekt angezeigt werden.
Suchen Sie im Ordner "Debug" oder "Release" die Datei mit dem Namen HelloWorld.dll.
Kopieren Sie die HelloWorld.dll Datei in Ihren Inetsrv-Ordner, der sich standardmäßig unter %WinDir%\System32\Inetsrv befindet.
Fügen Sie das modul HelloWorld.dll zu Ihrer Liste der Module hinzu (Anweisungen finden Sie unter Entwerfen Native-Code HTTP-Module).
Verwenden Sie Internet Explorer, um zu Ihrer Website zu navigieren; Ihr normaler Websiteinhalt sollte angezeigt werden.
Öffnen Sie die Windows-Ereignisanzeige, und wechseln Sie zum globalen Anwendungsprotokoll. Ein Eintrag, der "IISADMIN" als Ereignisquelle auflistet, sollte angezeigt werden.
Klicken Sie mit der rechten Maustaste auf das Ereignis, und klicken Sie dann auf "Eigenschaften ", um die Ereignisdetails anzuzeigen. Im Beschreibungsbereich sollte eine Meldung "Hello World!" angezeigt werden.
Problembehandlung für Ihre Einstellungen
Wenn Ihr Modul nicht wie erwartet kompiliert wird oder nicht funktioniert, finden Sie hier mehrere Bereiche, die Sie überprüfen können:
Stellen Sie sicher, dass Sie
__stdcallfür Ihre exportierten Funktionen angegeben haben oder dass Sie die Kompilierung mithilfe der__stdcall (/Gz)Aufrufkonvention konfiguriert haben.Stellen Sie sicher, dass Sie der Definitionsdatei den richtigen
RegisterModuleExport hinzugefügt haben.Stellen Sie sicher, dass Sie die Definitionsdatei den Projekteinstellungen hinzugefügt haben. Führen Sie die folgenden Schritte aus, um die Datei zu den Projekteinstellungen hinzuzufügen:
Klicken Sie im Menü Projekt auf Eigenschaften.
Erweitern Sie den Knoten "Konfigurationseigenschaften" in der Strukturansicht, erweitern Sie den Linker-Knoten , und klicken Sie dann auf "Eingabe".
Stellen Sie für die Einstellungen für die Moduldefinitionsdatei sicher, dass Ihre Definitionsdatei aufgeführt ist.