ISAPI 扩展概述

2024-11-09 12:00:12

ISAPI扩展概述

ISAPI 扩展是运行在IIS上并有权访问其提供所有函数的真实应用程序。典型ISAPI扩展示例:ISAPI扩展通过调用Asp.dll进行AS霸烹钟爷P页面处理。通常情况下,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和CGI比较

ISAPI(Internet 服务器应用程序编程接口)模型被发展成为CGI(通用网关接口)更快地替代方案。ISAPI提供比CGI更多优越性,包括低开销、更快加载时间和更好的可伸缩性。CGI和ISAPI编程模型主要区别是实现方法不同。

传统CGI,系统对于每个请求,将创建唯一进程。当http server每次收到一个请求时,都将启动一个新进程。对于cgi请求大量资源,操作系统必须保持这些进程。因固有限制,很难开发出灵活高效的互联网应用。

使用ISAPI,不需要单独进程。使用线程隔离和同步工作项目。有关更多信息,请参见 ISAPI和Web应用程序体系结构。

isapi与cgi几种执行方式的不同,isapi扩展执行以下操作:

o 接收数据放入 EXTENSION_CONTROL_BLOCK 结构成员lpbData中,而不是通过标准输入(stdin)进程令牌读取数据

o 使用 WriteClient 函数将数据发送回客户端,而不是通过标准输出(stdout)进程令牌发送数据。

o 通过 EXTENSION_CONTROL_BLOCK 结构访问常见cgi变量。对于其它变量,扩展调用GetServerVariable函数。cgi可执行文件中通过getenv环境变量表检索。

o 使用 WriteClient 函数直接发送标题或http状态码,或者调用HSE_REQ_SEND_RESPONSE_HEADER_EX ServerSupportFunction,替代 STDOUT 发送标题

o 位置/URL/标题 重定向。本地url,扩展使用HSE_REQ_SEND_URL结构,而不是写标头至STDOUT。若url是远程或未识别的,扩展使用 ServerSupportFunction 回调函数 HSE_REQ_SEND_URL_REDIRECT_RESP。当iis传入请求为一个特定扩展时,iis加载dll到内存中,为dll其它传入请求服务。iis卸载扩展时,若存在TerminateExtension函数调用,使用TerminateExtension可以释放(锁定或初始加载期间、Keep-Alive连接)的任何资源。

猜你喜欢