设计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_START 和 GL_APPLICATION_STOP 通知的方法。
函数 RegisterModule
还允许指定模块的优先级。 可用的优先级为 PRIORITY_ALIAS_FIRST
、、PRIORITY_ALIAS_HIGH
PRIORITY_ALIAS_MEDIUM
、 PRIORITY_ALIAS_LOW
和 PRIORITY_ALIAS_LAST
。 注册模块后,将按优先级和配置设置的顺序处理这些模块。 例如,如果创建注册为中等优先级模块的 HTTP 模块,则在处理所有高优先级模块之前,不会处理该模块。 可以将模块配置为在其他中等优先级模块之前进行处理,并且模块将在任何低优先级模块之前进行处理。
注意
通知的优先级顺序将反转 RQ_SEND_RESPONSE
。
创建Request-Level模块
创建模块工厂
本机代码请求级模块必须提供用于创建 CHttpModule 类实例的模块工厂。 模块工厂将从 IHttpModuleFactory 接口继承。
有关如何创建模块工厂的详细信息,请参阅 演练:使用本机代码创建Request-Level HTTP 模块中的代码示例。
创建派生自 CHttpModule 的类
请求级 HTTP 模块的main处理功能是通过派生自 基CHttpModule
类的模块提供的。 此类必须包含函数中列出的每个通知或后通知的 RegisterModule
回调方法。 例如,如果模块已注册 RQ_AUTHENTICATE_REQUEST 通知和 RQ_AUTHORIZE_REQUEST 后通知,则类必须包含 OnAuthenticateRequest 和 OnPostAuthorizeRequest 方法。
从 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_START 和 GL_APPLICATION_STOP 通知,则类必须包含 OnGlobalApplicationStart 和 OnGlobalApplicationStop 方法。
从 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 模块