ISAPI 扩展概述
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连接)的任何资源。