Compartilhar via


Passo a passo: criando um módulo HTTP Global-Level usando código nativo

Este passo a passo demonstra como usar o C++ para criar um módulo HTTP de nível global de exemplo que implementa a nova arquitetura de processamento de solicitações no IIS 7. Essa nova arquitetura estende os recursos de programação de código nativo quando você está escrevendo aplicativos IIS em versões anteriores de módulos HTTP ASP.NET e filtros OU extensões ISAPI. Para obter mais informações sobre como criar módulos HTTP usando a nova arquitetura de processamento de solicitações, consulte Criando módulos HTTP Native-Code.

Neste passo a passo, você criará um projeto C++ para seu módulo HTTP, adicionará o código necessário para um projeto "Olá, Mundo" e, em seguida, compilará e testará o módulo.

Pré-requisitos

O seguinte software é necessário para concluir as etapas no exemplo:

  • IIS 7.

  • Visual Studio 2005.

Observação

Você também pode usar o Visual Studio .NET 2003 ou anterior, embora as etapas passo a passo possam não ser idênticas.

Criando o módulo

Nesta parte do passo a passo, você criará um projeto de DLL C++ vazio para seu módulo HTTP.

Para criar um novo projeto de DLL do C++

  1. Inicie o Visual Studio 2005.

  2. Verifique se as opções globais têm todos os caminhos certos para o SDK incluem arquivos:

    1. No menu Ferramentas , clique em Opções.

    2. Expanda o nó Projetos e Soluções no modo de exibição de árvore e clique em Diretórios VC++.

    3. Na caixa suspensa Mostrar diretórios para , selecione Incluir arquivos.

    4. Verifique se o caminho em que você instalou o SDK inclui arquivos está listado. Se o caminho não estiver listado, clique no ícone Nova Linha e adicione o caminho em que você instalou os arquivos de inclusão do SDK.

    5. Clique em OK.

  3. Crie um novo projeto C++:

    1. No menu Arquivo , aponte para Novoe clique em Projeto.

      A caixa de diálogo Novo Projeto será aberta.

    2. No painel Tipos de Projeto , expanda o nó Visual C++ e clique em Win32.

    3. No painel Modelos , selecione Projeto Win32.

    4. Na caixa Nome , digite HelloWorld.

    5. Na caixa Localização, digite o caminho para o exemplo.

    6. Clique em OK.

      O Assistente de Aplicativo Win32 é aberto.

    7. Clique em Configurações do Aplicativo.

    8. Em Tipo de aplicativo, clique em DLL.

    9. Em Opções adicionais, clique em Projeto vazio.

    10. Clique em Concluir.

Adicionando o código e os arquivos de origem

A próxima etapa é adicionar os arquivos de definição de módulo e C++ necessários ao projeto.

Para adicionar os arquivos de origem ao projeto

  1. Crie o arquivo de definição de módulo para exportar a função RegisterModule :

    1. Em Gerenciador de Soluções, clique com o botão direito do mouse em Arquivos de Origem, aponte para Adicionar e clique em Novo Item.

      A caixa de diálogo Adicionar Novo Item é aberta.

    2. Expanda o nó do Visual C++ no painel Categorias e clique em Código.

    3. No painel Modelos , selecione o modelo Arquivo de Definição de Módulo .

    4. Na caixa Nome , digite HelloWorld e deixe o caminho padrão para o arquivo na caixa Localização .

    5. Clique em Adicionar.

    6. Adicione os códigos a seguir:

      LIBRARY HelloWorld  
      
      EXPORTS  
          RegisterModule  
      
  2. Opcionalmente, você pode exportar a função RegisterModule usando a opção /EXPORT:RegisterModule :

    1. No menu Projeto , clique em Propriedades do HelloWorld.

    2. Expanda o nó Propriedades de Configuração no modo de exibição de árvore, expanda o nó Vinculador e clique em Linha de Comando.

    3. Na caixa suspensa Configuração , selecione Todas as Configurações.

    4. Na caixa Opções Adicionais , digite /EXPORT:RegisterModule.

    5. Clique em OK.

  3. Crie o arquivo C++:

    1. Em Gerenciador de Soluções, clique com o botão direito do mouse em Arquivos de Origem, aponte para Adicionar e clique em Novo Item.

      A caixa de diálogo Adicionar Novo Item é aberta.

    2. Expanda o nó do Visual C++ no painel Categorias e clique em Código.

    3. No painel Modelos , selecione o modelo arquivo C++ .

    4. Na caixa Nome , digite HelloWorld e deixe o caminho padrão para o arquivo na caixa Localização .

    5. Clique em Adicionar.

    6. Adicione os códigos a seguir:

      #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. Opcionalmente, você pode compilar o código usando a __stdcall (/Gz) convenção de chamada:

    1. No menu Projeto , clique em Propriedades do HelloWorld.

    2. Expanda o nó Propriedades de Configuração no modo de exibição de árvore, expanda o nó C/C++ e clique em Avançado.

    3. Na caixa suspensa Configuração , selecione Todas as Configurações.

    4. Na caixa suspensa Convenção de Chamada , selecione __stdcall (/Gz).

    5. Clique em OK.

Compilando e testando o módulo

Seu módulo HTTP tem tudo o que precisa. Tudo o que é necessário é compilar e testar seu módulo HTTP.

Para compilar e testar o projeto

  1. Compile o módulo HTTP:

    1. No menu Compilar, clique em Compilar Solução.

    2. Verifique se o Visual Studio não retornou erros ou avisos. Se você encontrar erros ou avisos, precisará resolve esses problemas antes de testar o projeto.

  2. Copie o arquivo DLL do módulo HTTP para sua pasta do IIS:

    1. Abra o Windows Explorer e localize a pasta padrão especificada quando você criou o projeto C++.

      Dependendo das opções de build, você deverá ver uma pasta chamada Depurar ou Liberar na pasta padrão do projeto.

    2. Dentro da pasta Depurar ou Liberar, localize o arquivo chamado HelloWorld.dll.

    3. Copie o arquivo HelloWorld.dll para sua pasta Inetsrv, que está localizada por padrão em %WinDir%\System32\Inetsrv.

  3. Adicione o módulo HelloWorld.dll à sua lista de módulos (para obter instruções, consulte Criando módulos HTTP Native-Code).

  4. Use a Internet Explorer para navegar até seu site; você deverá ver o conteúdo normal do site.

  5. Abra a Visualizador de Eventos do Windows e alterne para o log de aplicativos global; você deverá ver uma entrada que lista "IISADMIN" como a origem do evento.

  6. Clique com o botão direito do mouse no evento e clique em Propriedades para exibir os detalhes do evento. Você deverá ver uma mensagem "Olá, Mundo!" exibida no painel Descrição.

Solução de problemas de suas configurações

Se o módulo não compilar ou não funcionar conforme o esperado, aqui estão várias áreas que você pode marcar:

  • Verifique se você especificou __stdcall para suas funções exportadas ou se configurou a compilação usando a __stdcall (/Gz) convenção de chamada.

  • Verifique se você adicionou a exportação correta RegisterModule ao arquivo de definição.

  • Verifique se você adicionou o arquivo de definição às configurações do projeto. Para adicionar o arquivo às configurações do projeto, conclua as seguintes etapas:

    1. No menu Projeto , clique em Propriedades.

    2. Expanda o nó Propriedades de Configuração no modo de exibição de árvore, expanda o nó Vinculador e clique em Entrada.

    3. Para as configurações do Arquivo de Definição de Módulo , verifique se o arquivo de definição está listado.

Confira também