ISAPI Extension概览

ISAPI extension运行在IIS上的真实的应用程序, 它可访问有IIS提供的所有功能. 一个强大的ISAPI的例子: ASP页面就是通过ISAPI extension来处理的. 总的来说, 客户端可以像访问静态HTML文件或者是动态的ASP文件一样的访问ISAPI extensions.

 

ISAPI extension被实现为DLL文件, 这些DLL文件会被由IIS控制的进程所加载. 跟ASP和HTML页面一样, IIS使用DLL文件的虚拟路径来映射文件系统上的ISAPI extension到由IIS服务的URL命名空间上.

 

Extensions和filters是通过ISAPI开发的两种类型的应用程序. ISAPI extension会在被请求到的时候运行, 这跟其他的静态HTML页面和动态的asp页面没有两样.  由于ISAPI应用程序都是编译过的代码, 它们的处理速度要比ASP文件和其他调用COM+组件的文件要快得多.

 

ISAPI filter和ISAPI extension只能使用C或C++开发. Visual Studio包含可以加速ISAPI开发的向导(wizards).

 

应用程序映射- Application Mappings

==================

应用程序映射(或脚本映射)在Web Server上与Windows上的文件关联是等效的. 比如说, 在Windows中, 当你打开一个以'.txt'结尾的文件时, 问就爱你通常会被Notepad打开, 因为TXT文件被Windows映射到了Notepad.exe上.

 

在IIS中, ASP功能是被包含在叫做ASP.DLL的ISAPI extension中的. 在IIS Server上被请求的任何以.asp结尾的文件都被映射到ASP.dll上, ASP.DLL会被指配来在客户端的窗口展现输出之前来处理文件.

 

一个客户端用下面的方式请求了ISAPI Extension:

http://Server_name/ISAPI_name.dll/Parameter

要请求一个ASP文件, 客户端可以请求一个类似http://Server_name/ASP.dll/File_name.asp 的URL, 因为ASP文件是由名为%windir%\system32\inetsrv\ASP.dll的ISAPI extension处理的. 然而, 为了简化ASP的请求, IIS使用了一个脚本映射, 把.asp文件扩展名跟ASP.DLL关联起来. 当收到类似http://Server_name/File_name.asp 请求的时候, IIS运行ASP.DLL这个isapi extension来处理这个请求. 很多运行在IIS上的应用程序实际上都是ISAPI extension, 他们都有各自的文件扩展名的映射.

ISAPI Extension处理流程- ISAPI Extension Processing Sequence

===================

  1. 如果DLL不在内存中, 那么IIS会加载DLL到内存中. DLL加载起来后, Windows自动地调用DLL的入口/出口函数(通常是DllMain函数). IIS然偶调用extension的GetExtensionVersion 入口函数.

  2. IIS对到来的请求执行一些少量的预处理.

  3. IIS创建并填充EXTENSION_CONTROL_BLOCK 结构, 用来传递请求数据和回调函数指针给extension.

  4. IIS调用ISAPI extension的HttpExtensionProc函数, 传递一个指向EXTENSION_CONTROL_BLOCK 结构的指针, 这个EXTENSION_CONTROL_BLOCK 结构是专门为这个请求而创建的.

  5. ISAPI extension执行一些它被设计的动作: 比如说, 从客户端读取更多的数据(与POST操作一样), 或者写入headers和数据到client端.

  6. Extension会通过离开HttpExtensionProc 函数来通知IIS它已经完成了对请求的处理. 对于同步操作, 函数返回HSE_STATUS_SUCCESS; 对与异步操作, 返回代码是HSE_STATUS_PENDING. 关于异步操作的更多信息, 请参考Asynchronous I/O Processing

  7. IIS对与请求所使用的连接执行清理动作, 在清理之后, 如果Keep-Alive功能没有开启的话, 它会关闭连接.

  8. 一旦ISAPI extension不再被需要了, IIS会调用TerminateExtension函数, 前提是如果extension提供了这个函数. 如果IIS被配置为缓存ISAPI extensions, 那么TerminateExtension就不会被调用, 直到IIS web server关闭或者重启时才调用它.

ISAPI和CGI

====================

关于Internet Server Application Programming Interface (ISAPI)模型和Common Gateway Interface (CGI)模型的对比, 请见MSDN原文.

参考资料:

ISAPI Extension Overview

http://msdn.microsoft.com/en-us/library/ms525172%28VS.90%29.aspx

原文地址:https://www.cnblogs.com/awpatp/p/1770803.html