Compartilhar via


Método CHttpModule::OnBeginRequest

Representa o método que manipulará um BeginRequest evento, que ocorre como o primeiro evento no pipeline de processamento de solicitações integrado a HTTP para a solicitação atual.

Sintaxe

virtual REQUEST_NOTIFICATION_STATUS OnBeginRequest(  
   IN IHttpContext* pHttpContext,  
   IN IHttpEventProvider* pProvider  
);  

Parâmetros

pHttpContext
[IN] Um ponteiro para uma interface IHttpContext .

pProvider
[IN] Um ponteiro para uma interface IHttpEventProvider .

Valor Retornado

Um valor REQUEST_NOTIFICATION_STATUS .

Comentários

Quando um módulo no nível de solicitação é registrado para a notificação de evento RQ_BEGIN_REQUEST, o IIS chamará o método do OnBeginRequest módulo quando uma solicitação entrar no pipeline de processamento de solicitação integrado.

Observação

Os módulos no nível da solicitação podem se registrar para a BeginRequest notificação de evento registrando-se RQ_BEGIN_REQUEST na função RegisterModule do módulo.

O IIS chama o método de um módulo antes da OnBeginRequest autenticação e da autorização; isso permite que os desenvolvedores usem o OnBeginRequest método para processar solicitações em que a identidade do cliente não é um problema.

Observação

Nem todas as solicitações entram no pipeline integrado de processamento de solicitações. Uma solicitação de um arquivo de imagem que pode ser atendido do cache não entrará no pipeline integrado de processamento de solicitações; portanto, o OnBeginRequest método não será chamado.

Exemplo

O exemplo a seguir demonstra como criar um módulo HTTP no nível da solicitação que se registra para as notificações de RQ_BEGIN_REQUEST evento e pós-evento. Quando uma solicitação entra no pipeline, o IIS chamará os métodos onPostBeginRequest e do módulo de OnBeginRequest exemplo. Cada método gravará uma entrada no log de aplicativos da Visualizador de Eventos do Windows. Quando o processamento for concluído, o módulo será encerrado.

#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>

// Create the module class.
class MyHttpModule : public CHttpModule
{
public:

    // Process an RQ_BEGIN_REQUEST event.
    REQUEST_NOTIFICATION_STATUS
    OnBeginRequest(
        IN IHttpContext * pHttpContext,
        IN IHttpEventProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pHttpContext );
        UNREFERENCED_PARAMETER( pProvider );
        WriteEventViewerLog("OnBeginRequest");
        return RQ_NOTIFICATION_CONTINUE;
    }

    // Process an RQ_BEGIN_REQUEST post-event.
    REQUEST_NOTIFICATION_STATUS
    OnPostBeginRequest(
        IN IHttpContext * pHttpContext,
        IN IHttpEventProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pHttpContext );
        UNREFERENCED_PARAMETER( pProvider );
        WriteEventViewerLog("OnPostBeginRequest");
        return RQ_NOTIFICATION_CONTINUE;
    }

    MyHttpModule()
    {
        // Open a handle to the Event Viewer.
        m_hEventLog = RegisterEventSource( NULL,"IISADMIN" );
    }

    ~MyHttpModule()
    {
        // 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 class factory.
class MyHttpModuleFactory : public IHttpModuleFactory
{
public:
    HRESULT
    GetHttpModule(
        OUT CHttpModule ** ppModule, 
        IN IModuleAllocator * pAllocator
    )
    {
        UNREFERENCED_PARAMETER( pAllocator );

        // Create a new instance.
        MyHttpModule * pModule = new MyHttpModule;

        // Test for an error.
        if (!pModule)
        {
            // Return an error if the factory cannot create the instance.
            return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
        }
        else
        {
            // Return a pointer to the module.
            *ppModule = pModule;
            pModule = NULL;
            // Return a success status.
            return S_OK;
        }            
    }

    void Terminate()
    {
        // Remove the class from memory.
        delete this;
    }
};

// Create the module's exported registration function.
HRESULT
__stdcall
RegisterModule(
    DWORD dwServerVersion,
    IHttpModuleRegistrationInfo * pModuleInfo,
    IHttpServer * pGlobalInfo
)
{
    UNREFERENCED_PARAMETER( dwServerVersion );
    UNREFERENCED_PARAMETER( pGlobalInfo );

    // Set the request notifications and exit.
    return pModuleInfo->SetRequestNotifications(
        // Specify the class factory.
        new MyHttpModuleFactory,
        // Specify the event notifications.
        RQ_BEGIN_REQUEST,
        // Specify the post-event notifications.
        RQ_BEGIN_REQUEST
    );
}

Seu módulo deve exportar a RegisterModule função. Você pode exportar essa função criando um arquivo de definição de módulo (.def) para seu projeto ou pode compilar o módulo usando a opção /EXPORT:RegisterModule . Para obter mais informações, consulte Passo a passo: criando um módulo HTTP Request-Level usando código nativo.

Opcionalmente, você pode compilar o código usando a __stdcall (/Gz) convenção de chamada em vez de declarar explicitamente a convenção de chamada para cada função.

Requisitos

Type Descrição
Cliente - IIS 7.0 no Windows Vista
- IIS 7.5 no Windows 7
- IIS 8.0 no Windows 8
- IIS 10.0 no Windows 10
Servidor - IIS 7.0 no Windows Server 2008
- IIS 7.5 no Windows Server 2008 R2
- IIS 8.0 no Windows Server 2012
- IIS 8.5 no Windows Server 2012 R2
- IIS 10.0 no Windows Server 2016
Produto - IIS 7.0, IIS 7.5, IIS 8.0, IIS 8.5, IIS 10.0
- IIS Express 7.5, IIS Express 8.0, IIS Express 10.0
parâmetro Httpserv.h

Consulte Também

Classe CHttpModule
Método CHttpModule::OnPostBeginRequest