技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
服务器技术
操作系统
网站运营

分类目录

热门标签

赞助商

搜索

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 扩展

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 这样的繁忙站点和一些流行的搜索引擎上,每天都可以看到数百万用户的客户端通信量。用户希望得到快速响应,如果响应时间过长他们将取消请求。

正如前面提到的,应用程序是线程安全的。除非需要,否则一定挂断资源或连接。不要使用全局变量。

当收到筛选器通知时:

  1. 快速处理该消息。
  2. 将其继续传递到下一个筛选器。
  3. 除非需要(例如,如果有一个必须首先运行的身份验证筛选器,或者正在提供或预处理由其他筛选器使用的数据),否则不要请求高优先级通知。

文章扩展

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扩展

▲ 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 程序映射

IIS 7 程序映射

2、ISAPI 筛选器

“ISAPI筛选器(ISAPI Filter)”也是一种DLL但不负责处理HTTP请求,主要作用是响应某些特定的事件。当这些事件发生时 ISAPI 筛选器被调用,它可以修改传入或传出的HTTP数据。在IIS 7中,使用“HTTP模块(HTTP Module)”取代了传统 ISAPI 筛选器的功能。

ISAPI 扩展与 ISAPI 筛选器名字很相近,但其在IIS中的地位和所起的作用是不同的。

您可能对以下文章也感兴趣

Tags: IIS