设计Native-Code HTTP 模块

IIS 7 中的 HTTP 模块使开发人员能够扩展或替换 IIS 核心功能。 例如,可以编写一个摘要式身份验证模块,以替换 IIS 7 中包含的模块。 尽管本机代码模块提供的某些功能可能与以前 ISAPI 筛选器提供的功能类似,但本机代码模块的设计方式不同,并提供比 ISAPI 筛选器更丰富的功能集。

Native-Code HTTP 模块的要求

添加导出的注册函数

导出 RegisterModule 函数需要 HTTP 模块。 可以通过为项目创建模块定义 (.def) 文件导出此函数,也可以使用 /EXPORT:RegisterModule 开关编译该模块。

指定通知和模块优先级

创建 RegisterModule 函数时,请指定一个位掩码,其中包含请求级模块将处理 (的通知列表,有关详细信息,请参阅 请求处理常量) 。 例如,请求级模块可以指定它将提供处理 RQ_BEGIN_REQUEST 通知和 RQ_MAP_PATH 后通知的方法。 同样,全局级别模块可以指定它将提供处理 GL_APPLICATION_STARTGL_APPLICATION_STOP 通知的方法。

函数 RegisterModule 还允许指定模块的优先级。 可用的优先级为 PRIORITY_ALIAS_FIRST、、PRIORITY_ALIAS_HIGHPRIORITY_ALIAS_MEDIUMPRIORITY_ALIAS_LOWPRIORITY_ALIAS_LAST。 注册模块后,将按优先级和配置设置的顺序处理这些模块。 例如,如果创建注册为中等优先级模块的 HTTP 模块,则在处理所有高优先级模块之前,不会处理该模块。 可以将模块配置为在其他中等优先级模块之前进行处理,并且模块将在任何低优先级模块之前进行处理。

注意

通知的优先级顺序将反转 RQ_SEND_RESPONSE

创建Request-Level模块

创建模块工厂

本机代码请求级模块必须提供用于创建 CHttpModule 类实例的模块工厂。 模块工厂将从 IHttpModuleFactory 接口继承。

有关如何创建模块工厂的详细信息,请参阅 演练:使用本机代码创建Request-Level HTTP 模块中的代码示例。

创建派生自 CHttpModule 的类

请求级 HTTP 模块的main处理功能是通过派生自 基CHttpModule类的模块提供的。 此类必须包含函数中列出的每个通知或后通知的 RegisterModule 回调方法。 例如,如果模块已注册 RQ_AUTHENTICATE_REQUEST 通知和 RQ_AUTHORIZE_REQUEST 后通知,则类必须包含 OnAuthenticateRequestOnPostAuthorizeRequest 方法。

从 CHttpModule 方法返回

当类中 CHttpModule 的方法完成处理后,每个方法都必须返回 一个REQUEST_NOTIFICATION_STATUS 枚举值。 此值确定 IIS 如何处理类方法的退出条件。 例如, 返回值 RQ_NOTIFICATION_CONTINUE 通知 IIS 继续处理请求。 相反, 返回值 RQ_NOTIFICATION_FINISH_REQUEST 指示 IIS 停止对当前请求进行处理。

CHttpModule Cleanup

当模块完成处理后,IIS 将调用模块的 CHttpModule::D ispose 方法从内存中删除类 CHttpModule

创建Global-Level模块

创建派生自 CGlobalModule 的类

全局级别 HTTP 模块的main处理功能是通过派生自基本 CGlobalModule 类的模块提供的。 此类必须包含函数中列出的每个通知的 RegisterModule 回调方法。 例如,如果模块已注册 GL_APPLICATION_STARTGL_APPLICATION_STOP 通知,则类必须包含 OnGlobalApplicationStartOnGlobalApplicationStop 方法。

从 CGlobalModule 方法返回

当类中 CGlobalModule 的方法完成处理后,每个方法都必须返回 一个GLOBAL_NOTIFICATION_STATUS 枚举值。 此值确定 IIS 如何处理类方法的退出条件。 例如,返回值 GL_NOTIFICATION_CONTINUE 通知 IIS 继续处理通知。 相反, 返回值 GL_NOTIFICATION_HANDLED 指示 IIS 停止处理当前通知。

CGlobalModule Cleanup

模块完成处理后,IIS 将调用模块的 CGlobalModule::Terminate 方法。 模块应使用此方法从内存中删除 CGlobalModule 类。

另请参阅

演练:使用本机代码创建Request-Level HTTP 模块
演练:使用本机代码创建Global-Level HTTP 模块
创建Native-Code HTTP 模块