Condividi tramite


Procedura dettagliata: Creazione di un modulo HTTP Global-Level tramite codice nativo

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 durante la scrittura di applicazioni IIS nelle versioni precedenti ASP.NET di moduli HTTP e filtri ISAPI o estensioni. Per altre informazioni sulla progettazione di moduli HTTP usando la nuova architettura di elaborazione delle richieste, vedere Progettazione di moduli HTTP Native-Code.

In questa procedura dettagliata verrà creato un progetto C++ per il modulo HTTP, aggiungere il codice necessario per un progetto "Hello World" e quindi compilare e testare il modulo.

Prerequisiti

Il software seguente è necessario per completare i passaggi nell'esempio:

  • IIS 7.

  • Visual Studio 2005

Nota

È anche possibile usare Visual Studio .NET 2003 o versioni precedenti, anche se la procedura dettagliata potrebbe non essere identica.

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++

  1. Avviare Visual Studio 2005.

  2. Verificare che le opzioni globali abbiano tutti i percorsi corretti per l'SDK includono file:

    1. Scegliere Opzioni dal menu Strumenti.

    2. Espandere il nodo Progetti e soluzioni nella visualizzazione albero e quindi fare clic su Directory VC++.

    3. Nella casella a discesa Mostra directory per l'elenco a discesa selezionare Includi file.

    4. Verificare che il percorso in cui è stato installato l'SDK includa i file è elencato. Se il percorso non è elencato, fare clic sull'icona Nuova riga e quindi aggiungere il percorso in cui è stato installato l'SDK includono file.

    5. Fare clic su OK.

  3. Creare un nuovo progetto C++:

    1. Scegliere Nuovo dal menu Filee quindi fare clic su Progetto.

      Verrà visualizzata la finestra di dialogo Nuovo progetto .

    2. Nel riquadro Tipi di progetto espandere il nodo Visual C++ e quindi fare clic su Win32.

    3. Nel riquadro Modelli selezionare Progetto Win32.

    4. Nella casella Nome digitare HelloWorld.

    5. Nella casella Posizione digitare il percorso per l'esempio.

    6. Fare clic su OK.

      Verrà visualizzata la Procedura guidata applicazione Win32 .

    7. Fare clic su Impostazioni applicazione.

    8. In Tipo di applicazione fare clic su DLL.

    9. In Opzioni aggiuntive fare clic su Progetto vuoto.

    10. Fare clic su Fine.

Aggiunta del codice e dei file di origine

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

  1. Creare il file di definizione del modulo per esportare la funzione RegisterModule :

    1. In Esplora soluzioni fare clic con il pulsante destro del mouse su File di origine, scegliere Aggiungi e quindi fare clic su Nuovo elemento.

      Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento .

    2. Espandere il nodo Visual C++ nel riquadro Categorie e quindi fare clic su Codice.

    3. Nel riquadro Modelli selezionare il modello File di definizione modulo .

    4. Nella casella Nome digitare HelloWorld e lasciare il percorso predefinito per il file nella casella Percorso .

    5. Scegliere Aggiungi.

    6. Aggiungere il codice seguente:

      LIBRARY HelloWorld  
      
      EXPORTS  
          RegisterModule  
      
  2. Facoltativamente, è possibile esportare la funzione RegisterModule usando l'opzione /EXPORT:RegisterModule :

    1. Nel menu Progetto fare clic su Proprietà HelloWorld.

    2. Espandere il nodo Proprietà configurazione nella visualizzazione albero, espandere il nodo Linker e quindi fare clic su Riga di comando.

    3. Nell'elenco a discesa Configurazione selezionare Tutte le configurazioni.

    4. Nella casella Opzioni aggiuntive digitare /EXPORT:RegisterModule.

    5. Fare clic su OK.

  3. Creare il file C++:

    1. In Esplora soluzioni fare clic con il pulsante destro del mouse su File di origine, scegliere Aggiungi e quindi fare clic su Nuovo elemento.

      Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento .

    2. Espandere il nodo Visual C++ nel riquadro Categorie e quindi fare clic su Codice.

    3. Nel riquadro Modelli selezionare il modello di file C++ .

    4. Nella casella Nome digitare HelloWorld e lasciare il percorso predefinito per il file nella casella Percorso .

    5. Scegliere Aggiungi.

    6. 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 );
      }
      
  4. Facoltativamente, è possibile compilare il codice usando la __stdcall (/Gz) convenzione chiamante:

    1. Nel menu Progetto fare clic su Proprietà HelloWorld.

    2. Espandere il nodo Proprietà di configurazione nella visualizzazione albero, espandere il nodo C/C++ e quindi fare clic su Avanzate.

    3. Nell'elenco a discesa Configurazione selezionare Tutte le configurazioni.

    4. Nella casella a discesa Convenzione chiamante selezionare __stdcall (/Gz).

    5. Fare clic su OK.

Compilazione e test del modulo

Il modulo HTTP ha tutto ciò che serve. Tutto ciò che è necessario è compilare e testare il modulo HTTP.

Per compilare e testare il progetto

  1. Compilare il modulo HTTP:

    1. Nel menu Compila scegliere Compila soluzione.

    2. Verificare che Visual Studio non abbia restituito errori o avvisi. Se si verificano errori o avvisi, è necessario risolvere questi problemi prima di testare il progetto.

  2. Copiare il file DLL per il modulo HTTP nella cartella IIS:

    1. Aprire Esplora risorse 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.

    2. All'interno della cartella Debug o Versione individuare il file denominato HelloWorld.dll.

    3. Copiare il file HelloWorld.dll nella cartella Inetsrv, che si trova per impostazione predefinita in %WinDir%\System32\Inetsrv.

  3. Aggiungere il modulo HelloWorld.dll all'elenco di moduli (per istruzioni, vedere Progettazione di moduli HTTP Native-Code).

  4. Usare Internet Explorer per passare al sito Web; dovrebbe essere visualizzato il contenuto normale del sito Web.

  5. Aprire il Visualizzatore eventi di Windows e passare al log dell'applicazione globale. Verrà visualizzata una voce che elenca "IISADMIN" come origine evento.

  6. 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 diverse aree che è possibile controllare:

  • Assicurarsi di aver specificato __stdcall per le funzioni esportate o che sia stata configurata la compilazione usando la __stdcall (/Gz) convenzione chiamante.

  • Assicurarsi di aver aggiunto l'esportazione corretta RegisterModule al file di definizione.

  • Assicurarsi di aver aggiunto il file di definizione alle impostazioni del progetto. Per aggiungere il file alle impostazioni del progetto, completare la procedura seguente:

    1. Scegliere Proprietà dal menu Progetto.

    2. Espandere il nodo Proprietà configurazione nella visualizzazione albero, espandere il nodo Linker e quindi fare clic su Input.

    3. Per le impostazioni file di definizione del modulo , assicurarsi che il file di definizione sia elencato.

Vedi anche