IIS里ISAPI扩展与ISAPI筛选器的区别和相同之处
作者:admin 时间:2017-4-7 8:43:36 浏览:我们用IIS搭建网站时,会看到两个地方的设置:ISAPI 筛选器、ISAPI 扩展。其中 ISAPI 筛选器我们一般用不到,而 ISAPI 扩展我们就很可能要用到,比如搭建php环境时就要用到 ISAPI 扩展。亲自搭建过php环境的人可能已经对 ISAPI 扩展有了一定的了解,但是对于 ISAPI 筛选器还可能未曾去了解过。我们在什么情况下要用到 ISAPI 筛选器呢?ISAPI 扩展与 ISAPI 筛选器的区别是什么呢?它们又有什么不同之处?这些都是本文要探讨的问题。
在讨论问题之前,我们先来了解一下 ISAPI 扩展。
ISAPI扩展概述
ISAPI 扩展是运行在IIS上并有权访问其提供所有函数的真实应用程序。典型 ISAPI 扩展示例: ISAPI 扩展通过调用Asp.dll进行ASP页面处理。通常情况下,ISAPI 扩展与客户端访问静态HTML文件或动态ASP文件方式相同。
ISAPI 扩展以 DLL 形式被IIS加载到进程空间中。客户端在URL请求中指定其名称激活 ISAPI 扩展并调用文件系统中虚拟可执行目录下的dll文件。
使用 ISAPI 可以开发两种类型应用程序:扩展和过滤器。ISAPI扩展与HTML、ASP请求运行方式相同。由于ISAPI应用程序使用编译方式,所以处理速度比Asp文件或调用COM+组件的文件处理快。
扩展和过滤器可以使用C或C++开发。Visual Studio包含ISAPI向导加快开发。
应用程序映射
Web Server请求应用程序映射(或脚本映射)方式与Windows中相同。如当你打开一个以".txt"结尾的文件,因为TXT文件映射至Notepad.exe,所以在记事本中打开。
ISAPI扩展通过调用ASP.dll处理Asp函数。任何以.asp文件结尾的请求在被输出至客户端窗口显示前都将被iis服务器映射至asp.dll。
客户端请求ISAPI扩展方式如下:
http://Server_name/ISAPI_name.dll/Parameter
请求asp文件,客户端URL请求如 http://Server_name/ASP.dll/File_name.asp 由于asp被%windir%\system32\inetsrv\ASP.dll 的扩展处理。为简化asp请求,iis使用脚本映射.asp与ASP.dll扩展。http://Server_name/File_name.asp 的请求接获时,iis运行asp.dll 服务请求加载处理文件。iis上应用程序都通过脚本进行特定文件名与扩展映射。
ISAPI 扩展处理顺序
当iis接收请求映射至扩展时,将发生如下事件:
1、如果不是已经在内存中,IIS 将加载 DLL。当加载 DLL 时,Windows 将自动调用 entry/exit 函数 (通常为 DllMain)。然后调用扩展的 GetExtensionVersion 入口点函数。
2、iis 对传入请求进行预处理
3、iis 通过扩展传递请求数据和回调函数 创建和填充 EXTENSION_CONTROL_BLOCK 结构
4、.iis 调用 HttpExtensionProc 函数,传递一个指针到 EXTENSION_CONTROL_BLOCK 结构创建该请求
5、执行更多isapi扩展操作:如从客户端读取更多数据(post操作),或向客户端写标题和数据
6、通过HttpExtensionProc 函数完成扩展信息处理。同步操作,函数返回HSE_STATUS_SUCCESS返回代码;异步操作,返回代码是HSE_STATUS_PENDING .如需有关异步操作的信息,请参阅异步I/O处理
7、iis执行清理请求连接,若 Keep-Alive 请求未启用,将关闭这个连接
8、不再需要ISAPI扩展时,IIS 若提供 TerminateExtension 函数,则调用执行。如果IIS配置为缓存ISAPI扩展,则不调用TerminateExtension 函数,直到IIS web 服务器关闭或重启。
注释:不要求每个请求调用GetExtensionVersion。相反,ISAPI 扩展对于每个请求只调用一次HttpExtensionProc。此外,EXTENSION_CONTROL_BLOCK结构用于每个传入请求。
ISAPI 筛选器和 ISAPI 扩展的属性设置
我们先来看看 ISAPI 筛选器和 ISAPI 扩展的属性在哪设置,如下面两图所示:
▲ ISAPI 筛选器
▲ ISAPI 扩展
ISAPI 扩展和 ISAPI 筛选器是如何被调用的?
Internet 服务器扩展 (ISA) 是您为扩展服务器功能而编写的程序。当某客户端发送请求调用 DLL 的 URL 从而显式请求调用 ISA 时,将调用 ISA。例如,http://yourserver/wwwquote.dll? 请求名为 yourserver 的服务器运行 DLL wwwquote。当用户单击 Web 页上的按钮时,也会发送 HTTP 请求。当 Web 页作为收集信息的窗体,而这些信息作为参数传递给 DLL 时,经常使用这种方法。例如,http://yourserver/wwwquote.dll?Issues?Method=ByCUSIP 调用 DLL 并将参数 Method=ByCUSIP 传递给函数 Issues。
相反,每次指定的事件发生时都调用 ISAPI 筛选器,无论服务器正在处理什么请求。如果包括了 SF_NOTIFY_URL_MAP(用于 URL 映射的标记),那么在请求通知时,每次 URL 映射到服务器时都将调用 OnURLMap 函数,与 URL 命令的内容无关。筛选器可以根据对服务器的每个请求来处理、检查和更改数据。
ISAPI 扩展和 ISAPI 筛选器的区别是什么?
服务器扩展: | 筛选器: |
---|---|
在 URL 中引用时运行。 | 为服务器处理的每个 URL 调用。 |
被显式调用,例如用 http://myserver/myprog.dll?。 | 如果发生已注册事件,自动为任何发送到服务器的 URL 运行。 |
被用户第一次调用时根据请求加载。 | 服务因其注册表项而启动时加载。 |
ISAPI 扩展和 ISAPI 筛选器的相同之处
ISAPI 扩展和 ISAPI 筛选器都:
- 共享服务的处理空间。
- 必须是线程安全的。
- 一经加载便保留在内存中(直到服务停止或者内存被其他进程所需要)。
ISAPI 筛选器和 ISAPI 扩展可以在同一 DLL 中吗?
在同一 DLL 中可以有一个筛选器(如果需要,可接收多个通知)和一个服务器扩展。这在筛选器和服务器扩展彼此相关时会很有用。例如,您可能希望在将数据发送到客户端之前执行数据的后处理,以便自定义特定浏览器的外观。另一个实例是在筛选器和扩展之间通信。可以将筛选器和应用程序放在同一 DLL 中,并在筛选器 SF_NOTIFY_PREPROC_HEADERS 通知期间添加一个键值标题。应用程序可以通过查找相应的上下文获取此键。
关于在 IIS 上使用 ISAPI 有哪些编程提示?
本文讨论针对在 Microsoft Internet 信息服务 (IIS) 上运行 ISAPI 扩展或筛选器的编程提示。如果在其他支持 ISAPI 的 Web 服务器上运行,这些服务器可能以不同的方式处理注册表项、内存和应用程序的加载。有关更多信息,请参见您正在使用的 Web 服务器的文档。
从 IIS 1.0 开始,ISAPI 筛选器在该服务启动时加载,并且直到该服务停止时才卸载。ISAPI 服务器扩展在第一次被调用时加载并保留在内存中,直到服务关闭或者内存被其他进程需要为止。由于 DLL 将长时间保留在内存中,因此需考虑何时分配资源、何时解除分配资源以及何时同数据源等资源连接或断开连接。
如何安装 ISAPI 筛选器或 ISAPI 扩展的新版本?
若要安装筛选器或 ISA 的新版本,必须关闭该服务、将 DLL 复制到适当的目录、更新注册表(如果它是新的筛选器)并重新启动该服务。
何时加载或卸载 DLL?
注册表项 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/FilterDLLs 控制该服务启动时加载的筛选器。它包含一个以逗号分隔的筛选器列表,其中包含它们的完整路径。若要加载其他筛选器,请停止该服务,将筛选器添加到注册表并重新启动该服务。
ISAPI 扩展在第一次被客户端调用时加载。
该服务启动后,筛选器将保留在内存中,直到关闭计算机或该服务为止。同样,服务器扩展一经加载便可能保留在内存中,直到关闭计算机或该服务为止。通过指定注册表设置 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/CacheExtensions=0,可以强制重新加载扩展 DLL(例如,出于调试的目的)。此设置直到该服务重新启动时才生效。注意此设置应该只在调试时使用。它对性能有负面影响,决不要在生产服务器上使用。
有哪些内存和资源注意事项?
我的应用程序必须是线程安全的吗?
是的。ISAPI 是作为 Web 服务器的一部分运行的。在像 Microsoft Internet 信息服务这样的多线程服务器上,您的应用程序在 Windows NT 服务的上下文中运行。您的应用程序可能从不同的线程同时被调用多次。数据必须受临界区的保护。
如何为处理同时请求进行计划?
ISAPI DLL 支持多个同时请求,确保临界数据受到保护是 ISAPI DLL 开发人员的责任。
Web 服务器天生可以同时处理多个请求。您的应用程序加上许多其他应用程序都将一直使用此服务器。在像 www.microsoft.com 这样的繁忙站点和一些流行的搜索引擎上,每天都可以看到数百万用户的客户端通信量。用户希望得到快速响应,如果响应时间过长他们将取消请求。
正如前面提到的,应用程序是线程安全的。除非需要,否则一定挂断资源或连接。不要使用全局变量。
当收到筛选器通知时:
- 快速处理该消息。
- 将其继续传递到下一个筛选器。
- 除非需要(例如,如果有一个必须首先运行的身份验证筛选器,或者正在提供或预处理由其他筛选器使用的数据),否则不要请求高优先级通知。
文章扩展
IIS中 ISAPI 扩展、ISAPI 筛选器
在IIS的文档中经常会提到两个术语:ISAPI扩展和ISAPI筛选器。
1、ISAPI 扩展
“ISAPI扩展(ISAPI Extension)”是一种可以添加到IIS中以增强Web服务器功能的程序,其载体为DLL文件。通常直接负责响应HTTP请求。
根据HTTP请求要访问的资源扩展名(通过URL获取),IIS会选取特定的 ISAPI 扩展来处理这一请求,这一过程被称为“程序映射”。 而用于响应HTTP请求的被称为“HTTP Handler(HTTP处理程序)”。 下图展示了IIS 6中的程序映射。
▲ ISAPI 扩展
在图中可以看到,IIS指定对php网页(其扩展名为.php)的请求将由php5isapi.dll处理。
IIS 7中的程序映射与IIS 6略有不同。当IIS 7以“经典模式”运行时,与IIS 6一样使用 php5isapi.dll 响应针对“.php”的请求。但当IIS 7以“集成模式”运行时,则使用托管处理程序(System.Web.UI.PageHandlerFactory)响应针对“.php”的请求(图 8‑13)。
IIS 7 程序映射
2、ISAPI 筛选器
“ISAPI筛选器(ISAPI Filter)”也是一种DLL但不负责处理HTTP请求,主要作用是响应某些特定的事件。当这些事件发生时 ISAPI 筛选器被调用,它可以修改传入或传出的HTTP数据。在IIS 7中,使用“HTTP模块(HTTP Module)”取代了传统 ISAPI 筛选器的功能。
ISAPI 扩展与 ISAPI 筛选器名字很相近,但其在IIS中的地位和所起的作用是不同的。
您可能对以下文章也感兴趣
标签: IIS
- 站长推荐