Поделиться через


Интерфейс IHttpEventProvider

Предоставляет универсальный интерфейс отчетов о событиях.

Синтаксис

class IHttpEventProvider  

Методы

В следующей таблице перечислены методы, предоставляемые классом IHttpEventProvider .

Имя Описание
SetErrorStatus Указывает возвращаемую ошибку.

Производные классы

В следующей таблице перечислены производные классы, предоставляемые интерфейсом IHttpEventProvider .

Имя Описание
IAuthenticationProvider Предоставляет интерфейс для уведомлений о событиях RQ_REQUEST_AUTHENTICATE.
ICacheProvider Предоставляет интерфейс для уведомлений о событиях GL_CACHE_OPERATION.
ICustomNotificationProvider Предоставляет интерфейс для уведомлений о событиях GL_CUSTOM_NOTIFCATION и RQ_CUSTOM_NOTIFCATION .
IGlobalConfigurationChangeProvider Предоставляет интерфейс для уведомлений о событиях GL_CONFIGURATION_CHANGE.
IGlobalFileChangeProvider Предоставляет интерфейс для уведомлений о событиях GL_FILE_CHANGE.
IGlobalRSCAQueryProvider Предоставляет интерфейс для уведомлений о событиях GL_RSCA_QUERY.
IGlobalStopListeningProvider Предоставляет интерфейс для уведомлений о событиях GL_STOP_LISTENING.
IGlobalThreadCleanupProvider Предоставляет интерфейс для уведомлений о событиях GL_THREAD_CLEANUP.
IGlobalTraceEventProvider Предоставляет интерфейс для уведомлений о событиях GL_TRACE_EVENT.
IHttpApplicationProvider Предоставляет интерфейс для уведомлений о событиях GL_APPLICATION_START.
IMapHandlerProvider Предоставляет интерфейс для уведомлений о событиях RQ_DETERMINE_HANDLER.
IMapPathProvider Предоставляет интерфейс для уведомлений о событиях RQ_MAP_PATH.
IPreBeginRequestProvider Предоставляет интерфейс для уведомлений о событиях GL_PRE_BEGIN_REQUEST.
IReadEntityProvider Предоставляет интерфейс для уведомлений о событиях RQ_READ_ENTITY.
ISendResponseProvider Предоставляет интерфейс для уведомлений о событиях RQ_SEND_RESPONSE .

Комментарии

Интерфейс IHttpEventProvider предоставляет универсальный интерфейс отчетов о событиях для большинства методов уведомлений и служит родительским классом для интерфейсов отчетов о событиях, которые используются с остальными уведомлениями.

Интерфейс IHttpEventProvider предоставляет только метод SetErrorStatus , который задает состояние ошибки для текущего контекста. Некоторые производные классы, унаследованные от , IHttpEventProvider предоставляют дополнительные методы, относящиеся к соответствующим событиям.

Пример

В следующем примере кода показано, как создать модуль HTTP, который отправляет пример строки веб-клиенту и фиксирует возвращаемое значение этой операции. Модуль использует метод , SetErrorStatus чтобы указать возвращаемое значение в качестве состояния ошибки для текущего запроса, а затем завершает работу.

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

// Create the module class.
class MyHttpModule : public CHttpModule
{
public:
    REQUEST_NOTIFICATION_STATUS
    OnBeginRequest(
        IN IHttpContext * pHttpContext,
        IN IHttpEventProvider * pProvider
    )
    {
        // Create an HRESULT to receive return values from methods.
        HRESULT hr;

        // Clear the existing response.
        pHttpContext->GetResponse()->Clear();
        // Set the MIME type to plain text.
        pHttpContext->GetResponse()->SetHeader(
            HttpHeaderContentType,"text/plain",
            (USHORT)strlen("text/plain"),TRUE);

        // Return a simple message to the Web client.
        hr = WriteResponseMessage(pHttpContext,"Hello World!");

        // Set the error status for the module.
        pProvider->SetErrorStatus( hr );

        // End additional processing.
        return RQ_NOTIFICATION_FINISH_REQUEST;
    }

private:

    // Create a utility method that inserts a string value into the response.
    HRESULT WriteResponseMessage(
        IHttpContext * pHttpContext,
        PCSTR pszBuffer
    )
    {
        // Create an HRESULT to receive return values from methods.
        HRESULT hr;
        
        // Create a data chunk.
        HTTP_DATA_CHUNK dataChunk;
        // Set the chunk to a chunk in memory.
        dataChunk.DataChunkType = HttpDataChunkFromMemory;
        // Buffer for bytes written of data chunk.
        DWORD cbSent;

        // Set the chunk to the buffer.
        dataChunk.FromMemory.pBuffer =
            (PVOID) pszBuffer;
        // Set the chunk size to the buffer size.
        dataChunk.FromMemory.BufferLength =
            (USHORT) strlen(pszBuffer);
        // Insert the data chunk into the response.
        hr = pHttpContext->GetResponse()->WriteEntityChunks(
            &dataChunk,1,FALSE,TRUE,&cbSent);
        // Test for an error.
        if (FAILED(hr))
        {
            // Return the error status.
            return hr;
        }

        // Return a success status.
        return S_OK;
    }
};

// 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(
        new MyHttpModuleFactory,
        RQ_BEGIN_REQUEST,
        0
    );
}

Модуль должен экспортировать функцию RegisterModule . Эту функцию можно экспортировать, создав файл определения модуля (DEF- файл) для проекта, или скомпилировать модуль с помощью /EXPORT:RegisterModule параметра . Дополнительные сведения см. в разделе Пошаговое руководство. Создание модуля HTTP Request-Level с помощью машинного кода.

При необходимости можно скомпилировать код с помощью __stdcall (/Gz) соглашения о вызовах вместо явного объявления соглашения о вызовах для каждой функции.

Требования

Тип Описание
клиент — IIS 7.0 в Windows Vista
— IIS 7.5 в Windows 7
— IIS 8.0 в Windows 8
— IIS 10.0 в Windows 10
Сервер — IIS 7.0 в Windows Server 2008
— IIS 7.5 в Windows Server 2008 R2
— IIS 8.0 в Windows Server 2012
— IIS 8.5 в Windows Server 2012 R2
— IIS 10.0 в Windows Server 2016
Продукт — 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
Заголовок Httpserv.h

См. также:

Основные интерфейсы веб-сервера
Интерфейс IAuthenticationProvider
Интерфейс ICacheProvider
Интерфейс ICustomNotificationProvider
Интерфейс IGlobalConfigurationChangeProvider
Интерфейс IGlobalFileChangeProvider
Интерфейс IGlobalRSCAQueryProvider
Интерфейс IGlobalStopListeningProvider
Интерфейс IGlobalThreadCleanupProvider
Интерфейс IGlobalTraceEventProvider
Интерфейс IHttpApplicationProvider
Интерфейс IMapHandlerProvider
Интерфейс IMapPathProvider
Интерфейс IPreBeginRequestProvider
Интерфейс IReadEntityProvider
Интерфейс ISendResponseProvider