Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa procedura dettagliata illustra come usare C++ per creare un modulo HTTP a livello globale di esempio che implementa la nuova architettura di elaborazione delle richieste in IIS 7. Questa nuova architettura estende le funzionalità di programmazione del codice nativo quando si scrivono applicazioni IIS su versioni precedenti di moduli HTTP ASP.NET e filtri o estensioni ISAPI. Per altre informazioni sulla progettazione di moduli HTTP tramite la nuova architettura di elaborazione delle richieste, vedere Progettazione di moduli HTTP Native-Code.
In questa procedura dettagliata si creerà un progetto C++ per il modulo HTTP, si aggiungerà il codice necessario per un progetto "Hello World" e quindi si compilerà e testerà il modulo.
Prerequisiti
Il software seguente è necessario per completare i passaggi nell'esempio:
IIS 7.
Visual Studio 2005.
Annotazioni
È anche possibile usare Visual Studio .NET 2003 o versioni precedenti, anche se i passaggi della procedura dettagliata potrebbero non essere identici.
Creazione del modulo
In questa parte della procedura dettagliata si creerà un progetto DLL C++ vuoto per il modulo HTTP.
Per creare un nuovo progetto DLL C++
Avviare Visual Studio 2005.
Verificare che le opzioni globali abbiano tutti i percorsi corretti per i file di inclusione dell'SDK.
Sul menu Strumenti, fare clic su Opzioni.
Espandere il nodo Progetti e soluzioni nella visualizzazione albero e quindi fare clic su Directory VC++.
Nella casella a discesa Mostra directory per selezionare Includi file.
Verificare che sia elencato il percorso in cui è stato installato l'SDK include file. Se il percorso non è elencato, fare clic sull'icona Nuova riga e quindi aggiungere il percorso in cui è stato installato l'SDK include file.
Fare clic su OK.
Creare un nuovo progetto C++:
Scegliere Nuovo dal menu Filee quindi fare clic su Progetto.
Verrà visualizzata la finestra di dialogo Nuovo progetto .
Nel riquadro Tipi di progetto espandere il nodo Visual C++ e quindi fare clic su Win32.
Nel riquadro Modelli selezionare Progetto Win32.
Nella casella Nome digitare HelloWorld.
Nella casella Posizione digitare il percorso per l'esempio.
Fare clic su OK.
La Creazione guidata per applicazione Win32 si apre.
Fare clic su Impostazioni applicazione.
In Tipo di applicazione fare clic su DLL.
In Opzioni aggiuntive fare clic su Progetto vuoto.
Fare clic su Fine.
Aggiunta del codice e dei file sorgenti
Il passaggio successivo consiste nell'aggiungere i file di definizione del modulo e C++ necessari al progetto.
Per aggiungere i file di origine al progetto
Creare il file di definizione del modulo per esportare la funzione RegisterModule :
In Esplora soluzioni fare clic con il pulsante destro del mouse su File di origine, scegliere Aggiungi e quindi fare clic su Nuovo elemento.
La finestra di dialogo Aggiungi nuovo elemento si apre.
Espandere il nodo Visual C++ nel riquadro Categorie e quindi fare clic su Codice.
Nel riquadro Modelli selezionare il modello File di Definizione Modulo.
Nella casella Nome digitare HelloWorld e lasciare il percorso predefinito per il file nella casella Percorso .
Fare clic su Aggiungi.
Aggiungere il codice seguente:
LIBRARY HelloWorld EXPORTS RegisterModule
Facoltativamente, è possibile esportare la funzione RegisterModule usando l'opzione /EXPORT:RegisterModule :
Scegliere Proprietà HelloWorld dal menu Progetto.
Espandere il nodo Proprietà di configurazione nella visualizzazione albero, espandere il nodo Linker e quindi fare clic su Riga di comando.
Nella casella di riepilogo a discesa Configurazione selezionare Tutte le configurazioni.
Nella casella Opzioni aggiuntive digitare /EXPORT:RegisterModule.
Fare clic su OK.
Creare il file C++:
In Esplora soluzioni fare clic con il pulsante destro del mouse su File di origine, scegliere Aggiungi e quindi fare clic su Nuovo elemento.
La finestra di dialogo Aggiungi nuovo elemento si apre.
Espandere il nodo Visual C++ nel riquadro Categorie e quindi fare clic su Codice.
Nel riquadro Modelli selezionare il modello file C++ .
Nella casella Nome digitare HelloWorld e lasciare il percorso predefinito per il file nella casella Percorso .
Fare clic su Aggiungi.
Aggiungere il codice seguente:
#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 ); }
Facoltativamente, è possibile compilare il codice usando la convenzione di
__stdcall (/Gz)chiamata:Scegliere Proprietà HelloWorld dal menu Progetto.
Espandere il nodo Proprietà di configurazione nella visualizzazione albero, espandere il nodo C/C++ e quindi fare clic su Avanzate.
Nella casella di riepilogo a discesa Configurazione selezionare Tutte le configurazioni.
Nell'elenco a discesa Convenzione di chiamata, selezionare __stdcall (/Gz).
Fare clic su OK.
Compilazione e test del modulo
Il modulo HTTP ha tutto ciò di cui ha bisogno. Tutto ciò che è necessario è compilare e testare il modulo HTTP.
Per compilare e testare il progetto
Compilare il modulo HTTP:
Nel menu Compila scegliere Compila soluzione.
Verificare che Visual Studio non restituisca errori o avvisi. Se si verificano errori o avvisi, è necessario risolvere questi problemi prima di testare il progetto.
Copiare il file DLL per il modulo HTTP nella cartella IIS:
Aprire Esplora File e individuare la cartella predefinita specificata al momento della creazione del progetto C++.
A seconda delle opzioni di compilazione, verrà visualizzata una cartella denominata Debug o Release nella cartella predefinita per il progetto.
All'interno della cartella Debug o Release individuare il file denominato HelloWorld.dll.
Copiare il file HelloWorld.dll nella cartella Inetsrv, che si trova per impostazione predefinita in %WinDir%\System32\Inetsrv.
Aggiungere il modulo HelloWorld.dll all'elenco dei moduli . Per istruzioni, vedere Progettazione di moduli HTTP Native-Code.
Utilizzare Internet Explorer per passare al sito Web; dovrebbe essere visualizzato il contenuto normale del sito Web.
Aprire il Visualizzatore eventi di Windows e passare al registro applicazioni globale; dovrebbe essere visualizzata una voce che elenca "IISADMIN" come origine evento.
Fare clic con il pulsante destro del mouse sull'evento e quindi scegliere Proprietà per visualizzare i dettagli dell'evento. Verrà visualizzato un messaggio "Hello World!" visualizzato nel riquadro Descrizione .
Risoluzione dei problemi relativi alle impostazioni
Se il modulo non viene compilato o non funziona come previsto, ecco alcune aree che è possibile controllare:
Assicurarsi di aver specificato
__stdcallper le funzioni esportate o di aver configurato la compilazione usando la convenzione di chiamata__stdcall (/Gz).Assicurarsi di aver aggiunto l'esportazione corretta
RegisterModuleal file di definizione.Assicurarsi di aver aggiunto il file di definizione alle impostazioni del progetto. Per aggiungere il file alle impostazioni del progetto, seguire questa procedura:
Scegliere Proprietàdal menu Project .
Espandere il nodo Proprietà di configurazione nella visualizzazione albero, espandere il nodo Linker e quindi fare clic su Input.
Per le impostazioni del file di definizione del modulo , assicurarsi che il file di definizione sia elencato.