CGlobalModule 类

定义全局级别 HTTP 模块的基类。

语法

class CGlobalModule  

方法

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

名称 说明
OnGlobalApplicationPreload deddc775-1ab0-492c-bda0-b32be5d4f4cc
OnGlobalApplicationResolveModules 表示将处理 GlobalApplicationResolveModules 事件的方法,该事件在 IIS 解析已注册的模块时发生。
OnGlobalApplicationStart 表示将处理 GlobalApplicationStart 事件的方法,该事件在 IIS 启动应用程序时发生。
OnGlobalApplicationStop 表示将处理 GlobalApplicationStop 事件的方法,该事件在 IIS 关闭应用程序时发生。
OnGlobalCacheCleanup 表示用来处理 GlobalCacheCleanup 事件的方法。
OnGlobalCacheOperation 表示将处理 GlobalCacheOperation 事件的方法,该事件在 IIS 执行与缓存相关的操作时发生。
OnGlobalConfigurationChange 表示将处理 GlobalConfigurationChange 事件的方法,该事件在对配置文件进行更改时发生。
OnGlobalCustomNotification 表示将处理 GlobalCustomNotification 事件的方法,该事件在模块引发用户定义的通知时发生。
OnGlobalFileChange 表示将处理 GlobalFileChange 事件的方法,该事件在网站中的文件发生更改时发生。
OnGlobalHealthCheck 表示将处理 GlobalHealthCheck 事件的方法,该事件在执行与运行状况相关的操作时发生。
OnGlobalPreBeginRequest 表示将处理 GlobalPreBeginRequest 事件的方法,该事件在请求进入管道之前发生。
OnGlobalRSCAQuery 表示将处理 GlobalRSCAQuery 事件的方法,该事件在执行Run-Time Status and Control 查询时发生。
OnGlobalStopListening 表示将处理 GlobalStopListening 事件的方法,该事件在 IIS 停止接受新请求时发生。
OnGlobalThreadCleanup 表示将处理 GlobalThreadCleanup 事件的方法,当 IIS 将线程返回到线程池时发生该事件。
OnGlobalTraceEvent 表示将处理 GlobalTraceEvent 事件的方法,该事件在引发跟踪事件时发生。
Terminate 表示当全局模块完成处理时 IIS 调用的方法。

派生类

此类不包含派生类。

备注

CGlobalModule 是全局级别 HTTP 模块的基类。 全局级别 HTTP 模块必须包含继承自 CGlobalModule的类。 CGlobalModule 定义 IIS 7 调用的方法,以在发生全局级别事件时处理全局级别通知。 HTTP 模块可以通过在模块的导出 RegisterModule 函数中定义通知列表来注册特定事件。 当全局级别模块完成处理后,该模块应使用 CGlobalModule::Terminate 方法从内存中删除 CGlobalModule 实例。

示例

下面的代码示例演示如何创建简单的“Hello World”全局级 HTTP 模块。 模块定义导出的 RegisterModule 函数,该函数创建派生自 CGlobalModule的类的实例。 如果无法创建类,则函数退出并显示错误代码;否则,函数会调用 IHttpModuleRegistrationInfo::SetRequestNotifications 方法来注册 GL_PRE_BEGIN_REQUEST 通知。

GL_PRE_BEGIN_REQUEST发生通知时,IIS 会调用模块的 CGlobalModule::OnGlobalPreBeginRequest 方法来处理通知。 方法调用私有方法将事件写入事件查看器的应用程序日志,然后返回GL_NOTIFICATION_CONTINUE通知 IIS 继续处理其他通知。 处理完成后,IIS 会调用模块的 CGlobalModule::Terminate 方法从内存中删除类。

#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 );
}

模块必须导出 RegisterModule 函数。 可以通过为项目创建模块定义 (.def) 文件导出此函数,也可以使用 开关编译模块 /EXPORT:RegisterModule 。 有关详细信息,请参阅 演练:使用本机代码创建Global-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 服务器核心类
创建Native-Code HTTP 模块
CHttpModule 类