isapi
ISAPI
IDC:Internet Database Connector
在CGI方法中.Web服务器通过执行一个外部程序来处理每一个应用要求。服务据分
析应用请求的内容并把这个信息传给CGI程序。CGI程序可以对输入信息进行必要的处
理。给客户机回送数据通过标准输出设备进行,网络服务器会接收输出并把它传给客户机。
CGI最突出的缺点是操作太慢。对接到的每一个请求,CGI方法要求服务器执行一个外
部程序。这涉及到在操作系统中创建一个新的进程,从磁盘上装载可执行映象,并在完成时
再把它全部清除。另外,在每一次调用时(如数据库连接资源)必须重新建立。它们既不能被
缓存也不能重用.因为在两个调用之间进程不能保持。
ISAPI扩展的特性使它比同样的用CGI接口编写的应用程序执行起来更快。这主要是由它们调用方式的不同造成的。ISAPI扩展是通过一个DLL实现的,它一般只被服务器装载一次,当后续请求再来时,系统直接从内存中调用它。
相反,CGI应用程序每次被调用时,都必须装载。很明显,每次调用时消耗在产生新进程及从磁盘装载可执行文件的时间都是很多的。事实上,很可能CGI应用程序会被放在磁盘的高速缓冲存储器里,但这仍然需要花费时间来从高速缓冲存储器里拷贝映像及完成必要的地址映射操作。除了自动避免这些消耗外,精心设计的ISAPI扩展能从它的内存驻留方式中受益无穷。扩展可以将经常使用或不便再次产生的资源驻留起来,如数据库连接。直接使用启动时产生的数据库连接在许多情况下能加速一个应用程序。这样的设计需要认真注意多线程的同步性和内存管理中的细节问题,所以要改善性能需要你付出更多的努力。
调用一个扩展
当服务器接收到一个请求,它首先判断怎样处理这一请求。这取决于很多事情,包括被请求资源的文件扩展名(在扩展名映射表中寻找)、请求的类型(GET或PDT),以及请求的内容(一个GET带一个问号表示一个可执行文件)。通常,跟在资源(以.DLL为扩展名)后的一个带问号的Post请求或GET请求表示执行一个ISAPI扩展。如果服务器确定一个ISAPI扩展将被执行,它首先检查此扩展是否已经装入高速缓存,如果没有,则DLL被装载。它的位置由请求本身所决定。URL则由服务器从逻辑目录名转换为磁盘上的物理位置。装载DLL以后,服务器就调用扩展的GetFilterVersion()函数。这样,通过比较所用的
ISAPI规范版本来确保服务器和扩展的兼容性,同时提供一个让扩展初始化所有共享资源的机会‘
处理请求
随着DLL驻入内存.通过调用DLL中的HttpExtension ()函数服务于请求。这里是ISAPI程序员放置实际想要执行的操作的位置。服务器将所有必要的信息传递给这个函数,包括请求本身的内容。同时传递回调函数,可以用它将数据传递给客户,获取同请求一起传送的信息,以及执行一些其他的操作。
一定要记住,服务器上的许多客户可能同时对同一扩展的进程发出请求。服务器可启动
多线程来处理这些请求,从而引发扩展同时执行几个不同的线程。如果不能正确的处理线程
间的同步可能会造成数据破坏甚至系统崩溃。
过滤器
过滤器是编制Internet应用程序中的新概念,在传统的CGI编程中没有与之相似的概
念。正是这个特性构成ISAPI编程的灵活性。ISAPI扩展主要是为服务于特殊请求而设计
的,而过滤器与服务器却是以完全不同的方式交互作用的。每次当一件与过滤器有关的事件
发生时,过滤器就会被服务器调用,而不管资源是否被请求。ISAPI过滤器是用来提供横向功能层(见图1.2)。它可以实现所有请求所共有的某一功能要求。
例如;每次当一个请求(指任何请求)被服务器所接收时,过滤器可以放通知请求。该过滤器然后检查这个请求,在必要时还可改变它。这样做可以用于许多目的。
一个可能的用途是根据用户所用语言调整请求的目录结构,如英语用户读英文页面,西班牙语用户读西班牙语页面。判断为何种语言可通过检查一些浏览器里的Accept—language,或者通过设置一个Cookie完成。根据结果,过滤器可改变被请求的URL,使其指向适当的语言对应的目录结构。
因为二者性质不同.过滤器同扩展的调用方式也不同。过滤器是服务器启动时由IIS装载的,服务器通过系统注册表来确定装载哪种DLL。过滤器一旦被装载.就会调用GetFilterVersion ()函数。同扩展一样,此时允许服务器和过滤器来验证兼容性及让过滤器执行初始化。当然,过滤器也必须向服务器表明哪些事件需要,及以何种优先级被通知,即它是在别的过滤器之前或是之后被通知。
服务器先建立每类事件调用的过滤器列表。然后,当事件在进程中发生时,服务器就调用相关过滤器所属的HttpFdterProc()函数,每个过滤器被依次调用,次序由过滤器请求的优先级所决定,即由过滤器在注册表中所出现的次序所决定。
通知从一个过滤器传到下一个过滤器,每个过滤器检查此通知,并决定处理方法。过滤
器可以以各种方式对其作用,如,附加一个记录或者改变所接收的数据(如前所述)。
完成任务以后,过滤器返回服务器并说明对该通知的处理方式。这类似于一个Windows
消息队列中的消息被送往一个程序的消息处理程序函数。过滤器也能向服务器表明,它已将
整个事件处理完毕,不再需要触发其后的过滤器。通常,过滤器允许任何下游的过滤器查看
它所处理的事件。注意.返回的状态值并不一定要和过滤器执行的动作类型相联系。过滤器
可以与其下游过滤器作用于同一个通知。
在正常操作下,IIS是以Windows NT系统服务的方式运行的,所以,DLL的运行是代表系统而不是一个特殊用户。虽然调试时,它代表用户。正因为如此,当运行扩展或过滤器时,调试中不会出现的问题可能出现。例如,如果你的ODBC数据源是通过用户的DSN而不是系统的DSN来访问。那么,调试时你能成功地访问数据,而运行时却是失败的。