ISAPI扩展初窥

从CGI说起…

话说CGI(Common Gateway Interface)通用网管接口是一项古老的动态网页交换技术,CGI程序通过对请求信息的解析,可以产生相应的处理,例如它可以在服务器端实现表格处理、数据查询、发送电子邮件等操作,并最终将处理后的信息返回给客户端浏览器,CGI技术可以说是动态网页技术的鼻祖,它在刚出道之际也是风靡一时,至今的许多应用仍然能够看到CGI的身影。然而就像许多技术一样,CGI本身也不可避免的具有一定的缺陷。当你在使用C、C++、甚至Perl语言在服务器端编写完成你的EXE程序并关联到相应请求后,每次的这个请求都会在内存中加载执行你的EXE程序,甚至是某个用户不断的打开同一个页面也是如此,重复的加载执行会消耗大量的内存,当类似这样的并发请求增多时,极容易造成服务器的崩溃。此外一个相对复杂的CGI程序本身的开发对于用惯了.net java的程序来说也是一个痛苦的过程。于是CGI唯一的优势似乎就剩下了较高的运行效率(接近于底层)。

缺陷怎么办?

作为CGI的一个替代品,ISAPI扩展提供了与CGI程序相似的功能,不同的是它通过给其宿主进程(例如IIS)提供三个规范的接口来保证其本身只在内存中装载一次,也即是说不管有多少客户端在同一时间请求,它只实例化一次。从而避免了像CGI那样大量的内存消耗。至于具体的接口会在下文中介绍。

什么是ISAPI?

好了,说了那么半天废话,我们的主角终于华丽的登场了—ISAPI,全称是Internet Server Application Programming Interface(Internet服务器应用编程接口)它为开发人员提供了更加强大的对于IIS功能的扩展,这也就是我们常说的ISAPI扩展。ISAPI本身并没有受限于IIS,相反它为IIS提供了更高的灵活性与扩展。

ISAPI与IIS是如何协同工作的呢?

考虑到性能原因,ISAPI和调用它的IIS是在同一个进程中的,这使得它们彼此间的可以共享某些数据,从而大大提高了相互访问的速度,但这种直接访问使得ISAPI本身出现错误时很可能也影响到IIS,导致IIS服务器瘫痪。于是ECB便应运而生,ECB的全称是Extension Control Block 它是一个非托管资源包,具有对ISAPI接口完整的访问能力,如用于表单变量的输入流和用于回写数据到客户端的输出流。当IIS接受到一个web请求后,首先调用自身的ProcessRequest函数进行处理,这个函数通过传递一个ECB的指针来间接的操作ISAPI。可以说ECB是最初接触到托管代码的入口和出口。

ISAPI到底做了哪些事?

我们不妨模拟一个web请求看看ISAPI到底是经历了那些步骤,做过哪些处理。假设一个用户正在浏览器中输入类似http://www.mydomain.com/script/example.dll?ID=p05874 & Tx=870250AZT6这样的网址并点击回车,请求经过通过N层协议的转换经过N次路由终于来到了服务器端(假设我们使用的是IIS服务器),服务器首先检查example.dll是否已经装在到内存中,如果尚未装在,并首先初始化该DLL并新启动一个进程,一旦该DLL已经载入内存,一个用于管理ISAPI扩展的线程便启动了,在调用入口函数DLLMain之后,调用了一个叫做GetExtensionVersion的函数来执行如下两项工作:

  1. 交换版本信息(Exchange version information)。
  2. 得到一个关于该扩展的文本描述。

在此之后,IIS服务器通过之前提到的ECB指针调用ISAPI扩展中的一个称作HttpExtensionProc的函数,该函数的任务是将处理过后的数据写回到客户端。第三步同时也是最后一步就是在扩展从内存中卸载之前执行TerminateExtension操作。所有的资源将会在这个函数中释放。

现在,我们再来简单回顾一下ISAPI扩展向web服务器暴露的三个接口:

  1. GetExtensionVersion
  2. HttpExtensionProc
  3. TerminateExtension(可选择)

关于ISAPI过滤器(Filter)

再简单介绍一下ISAPI过滤器,内容来自于MSDN。ISAPI 筛选器是在启用 ISAPI 的 HTTP 服务器上运行的 DLL,用以筛选与服务器之间来回传送的数据。该筛选器注册事件的通知,例如登录或 URL 映射。当发生选定事件时,筛选器被调用,并且可以监视及更改数据(在数据从服务器传输到客户端或相反的过程中)。可以使用 ISAPI 筛选器提供增强的 HTTP 请求记录(例如,跟踪登录到服务器的用户)、自定义加密、自定义压缩或其他身份验证方法。

参考:

  1. http://www.codeproject.com/isapi/isapi_extensions.asp
  2. http://www.cnblogs.com/tmfc/archive/2006/08/29/489779.aspx
  3. http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_internet_server_api_.28.isapi.29_.extensions.asp

posted on 2007-02-28 00:00  shenfx  阅读(...)  评论(... 编辑 收藏

导航

统计