IHttpEventProvider 接口

提供泛型事件报告接口。

语法

class IHttpEventProvider  

方法

下表列出了 类 IHttpEventProvider 公开的方法。

名称 说明
SetErrorStatus 指定要返回的错误。

派生类

下表列出了 接口 IHttpEventProvider 公开的派生类。

名称 说明
IAuthenticationProvider 提供 用于RQ_REQUEST_AUTHENTICATE 事件通知的接口。
ICacheProvider 提供 用于GL_CACHE_OPERATION 事件通知的接口。
ICustomNotificationProvider GL_CUSTOM_NOTIFCATIONRQ_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 模块,该模块将示例字符串发送到 Web 客户端,并从此操作捕获返回值。 模块使用 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 。 有关详细信息,请参阅 演练:使用本机代码创建Request-Level HTTP 模块

可以选择使用调用约定编译代码, __stdcall (/Gz) 而不是为每个函数显式声明调用约定。

要求

类型 说明
客户端 - Windows Vista 上的 IIS 7.0
- Windows 7 上的 IIS 7.5
- Windows 8 上的 IIS 8.0
- Windows 10 上的 IIS 10.0
服务器 - Windows Server 2008 上的 IIS 7.0
- Windows Server 2008 R2 上的 IIS 7.5
- Windows Server 2012 上的 IIS 8.0
- Windows Server 2012 R2 上的 IIS 8.5
- Windows Server 2016 上的 IIS 10.0
产品 - 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
Header Httpserv.h

另请参阅

Web 服务器核心接口
IAuthenticationProvider 接口
ICacheProvider 接口
ICustomNotificationProvider 接口
IGlobalConfigurationChangeProvider 接口
IGlobalFileChangeProvider 接口
IGlobalRSCAQueryProvider 接口
IGlobalStopListeningProvider 接口
IGlobalThreadCleanupProvider 接口
IGlobalTraceEventProvider 接口
IHttpApplicationProvider 接口
IMapHandlerProvider 接口
IMapPathProvider 接口
IPreBeginRequestProvider 接口
IReadEntityProvider 接口
ISendResponseProvider 接口