ISAPI 过滤器
本节介绍有关使用IS钽吟篑瑜API过滤器开发动态Web内容的信息。ISAPI以CGI方式提供相同功能,但是比CGI,ASP,和调用COM+组件的文件执行速度更快。
有关ISAPI过滤器示例,请参见 创建ISAPI过滤器。
本部分包含如下主题:
o ISAPI过滤器概述
o ISAPI过滤器功能变化
ISAPI过滤器使用DLL文件为IIS提供修改和增强功能。ISAPI过滤器在IIS服务器上总是运行,过滤每个请求直到它们找到需要处理的。传入和传出数据流检查和修改的能力使ISAPI过滤器更强大和灵活。过滤器被登记为站点级别或全局级别(即,全局过滤器对网站而言是全局的)并在工作进程启动时初始化。过滤器安装后监听这个站点的所有请求。
ISAPI过滤器和ISAPI扩展可以只使用C/C++开发。Visual Studio使用向导让ISAPI开发更快速和容易。
ISAPI过滤器用途
ISAPI过滤器在IIS上被注册改变服务器行为。例如,过滤器可以处理如上任务:
o 改变客户端发送请求数据(URLS 或 报头)
o 通过获取URL映射控制物理文件
o 使用匿名或基本身份验证控制用户名和密码
o 修改或分析身份验证完成请求
o 修改响应返回给客户端
o "拒绝访问"响应运行自定义处理
o 完成请求运行处理
o 运行处理客户端关闭连接
o 执行指定日志或跟踪分析
o 执行自定义身份验证
o 加密和压缩处理
注释:ISAPI DLL 过滤器不能显式请求,ISAPI扩展可以。
ISAPI过滤器处理顺序
每个单独ISAPI DLL过滤器中必须包含导出两个入口点函数,GetFilterVersion和HttpFilterProc,和可选项导出TerminateFilter函数。
下面概述ISAPI过滤器和IIS之间的交互:
1. IIS加载初始化ISAPI过滤器时,创建和填充部分HTTP_FILTER_VERSION结构。然后调用过滤器的GetFilterVersion函数,传递一个指针到新结构作为一个参数。
2.ISAPI过滤器使用版本信息和描述令牌填充HTTP_FILTER_VERSION结构。更重要的是。可以使用HTTP_FILTER_VERSION接收指定通知事件和声明过滤器通常优先级。此外,过滤器也可以指定安全端口/不安全端口或两者相关的事件。
3.IIS和客户端浏览器间每个HTTP交互触发几个不同事件。每次事件发生ISAPI过滤器都将被注册,IIS调用过滤器的HttpFilterProc入口点函数。
若一个指定事件有多于一个ISAPI过滤器注册,那么IIS通知过滤器产生事件。过滤器被标记为高、中、低优先级并按照降序排序通知优先级。若ISAPI过滤器声明相同优先级多于一个,IIS使用FilterLoadOrder属性解决过滤器执行顺序。
4.ISAPI过滤器使用通知类型信息,通过IIS作为一个参数传递到 HttpFilterProc和确定其参数 pvNotification 指向这些操作的数据结构和函数指针。然后ISAPI过滤器使用数据结构中的数据,在HTTP_FILTER_CONTEXT上下文结构中执行任意自定义处理。
5.处理完成以后,过滤器返回SF_STATUS状态码 1 到IIS,并继续处理HTTP请求和响应直到另一事件发生ISAPI过滤器注册。
6.当Web服务停止或卸载时,IIS在所有过滤器中调用TerminateFilter作为停机顺序的一部分,以便过滤器实现并导出函数。TerminateFilter 一般用于执行清理和资源回收配置。
当ISAPI过滤器加载初始化时 GetFilterVersion 只调用一次。每个连接初始化开发人员必须使用 HttpFilterProc 函数调用执行上下文管理。
注释:ISAPI过滤器中每个过滤器都要优先级设置。例如,一个低等级优先级不能指派一个通知类型和另一个高等级优先级类型。