山东移动通信公司 郭彬
---- 本文通过对CGI和ISAPI的对比以及对ISAPI的工作原理的分析,阐述了使用MFC ISAPI编程的一般方法。
---- 一、ISAPI简介:
---- 目前大多数网站提供信息的方式是由用户通过客户浏览器(如Netscape或Explorer等)与WWW服务器连接,然后用鼠标点按超级连接以浏览相关的主页。在此过程中,基本上是服务器向客户端单方向的信息传递,随着服务需求的不断扩大,这种单纯的单方向传递信息的静态主页已不能满足需求。不论是服务提供方还是客户,都希望在浏览服务器将信息发送到用户同时,用户端也能将信息发送到服务器端,实现服务器与客户的交互。典型的应用如:用户登记表、用户留言板以及用户通过WWW检索服务器端的数据库等等。
---- 要实现一个可与用户交互信息的服务系统,所需增加的有两项:交互式主页和用户输入信息处理程序。交互式主页即有输入信息的编辑框,选择菜单按钮之类的主页,以供用户输入信息;用户输入的信息则交由用户信息处理程序处理。实现该程序可以有多种途径,该程序可以放在服务器端,也可以放在客户机端,前者如CGI、ISAPI,后者如JAVA Applet、javascript等等。
---- ISAPI(即Internet Server Application Program Interface),是微软提供的一套面向Internet 服务的API接口,它能实现CGI(Common Gateway Interface,公共网关接口)能提供的全部功能,并在此基础上进行了扩展,如提供了过滤器应用程序接口。
---- 在Web服务器这个竞争激烈的领域里,微软的IIS(Internet Information Server,Internet信息服务器)是当今Windows NT操作平台上执行效率最高的Web服务器之一。IIS提供所有传统的内容传递方式,它对静态网页有着良好的支持。对于更复杂的应用程序,IIS提供了功能更强的应用框架:使用ISAPI能够创造出极高性能的应用程序。书写良好的ISAPI扩展的性能可能超过类似的CGI一个数量级。此外,ISAPI的灵活性使一些事情变得简单。
---- ISAPI提供了扩展支持WEB服务器的简单而有效的方法。开发人员可以设计生成ISAPI 服务器扩展动态连接库(ISAPI Server Extension DLL),它可以被HTTP服务器调用。例如,客户端用户填写了一个表单,按下"提交"按钮后,输入的数据将被传送至HTTP服务器,激活相应的ISAPI扩展应用程序,该应用程序可以处理用户的输入信息,进行相应的操作。或者,按照用户的要求访问数据库,读取用户指定的数据,动态生成HTML文件,再传回客户端。
---- CGI很早就作为交互式的Web应用程序的一个标准广泛应用在Internet之中。CGI脚本允许人们用多种编程语言如Basic、C、Perl、Shell 等等来编写简单的应用程序。这些脚本运行在Web服务器上,而在客户的Web浏览器上输出运行结果。客户的输入通过环境变量或者标准输入设备来进行传递,然后CGI程序根据需要完成特定的功能,并通过标准输出设备送回HTML格式的结果显示在客户的浏览器中。CGI的这一特性―设计简单,再加上它支持多种编程语言,使得开发CGI应用程序非常简单。尽管如此,人们在使用中还是发现了CGI应用程序的一个很大的缺点:性能不高。 虽然有不少办法来使CGI应用程序运行得更快一些(如把它们变成编译好的二进制代码,而不用Perl脚本),但执行速度仍然是一个问题。每当通过Web访问一个CGI程序时,CGI执行文件(或者脚本的解释器)都要为每一个请求创建一个新的进程。对于一个信息量比较大的站点来说,这无疑给服务器增加了一个沉重的负担。
---- 二、ISAPI的工作原理:
---- ISAPI的工作原理和CGI大体上是相同的,都是通过交互式主页取得用户输入信息,然后交服务器后台处理。但是二者在实现机制上大相庭径。ISAPI与CGI最大的区别在于:在ISAPI下建立的应用程序是以动态连接库(Dynamic Link Lib,DLL)的形式存在;而CGI的应用程序一般都是可执行程序。ISAPI应用的工作流程与CGI也有一些不同。ISAPI应用的DLL不仅可以象CGI程序一样被用户请求激活,还可以被系统预先激活来监视用户输入;对于被用户激活的DLL,在处理完一个用户请求后不会马上消失,而是继续驻留在内存中等待处理别的用户输入,直到过了一段时间后一直没有用户输入。
---- 一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,此外,ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。
---- 不过ISAPI的平台兼容性较差,目前只能用于微软自己的Windows 95和NT操作系统上,服务器平台也仅限于IIS(Internet Information Server)和MS personal web server以及NT workstation上的peer web server。
---- ISAPI DLLs的调用方法和CGI一样:在客户端使用GET或POST方法。例如,当客户作出下列请求时:
---- ---- http://www.mysite.com/myisa.dll?name=fisherman&id=12345 "name"域和"id"域以及与它们相关的数据都被传递给ISA。ISAPI在使用这些相关的数据之前把它们存放在相应的数据结构中,这是通过一个请求映射系统来实现的。
---- 每一个请求都有一个解析映射表。通过定义服务器从客户接收的数据的类型和顺序,该解析映射表可以把数据传递到合适的数据结构中。例如,对于请求"name=fisherman&id=12345",解析映射表将显示一个字符串和一个整型数,并且" fisherman " and "12345"将被解析出来存放到各自的数据结构中。
---- 解析映射系统还有另外一个功能:ISAPI可以把请求传递给ISA内特定的成员函数。请求字符串可以包含一个命令,解析映射表就使用该命令把请求传递给ISA内正确的成员函数。
---- 三、MFC的ISAPI编程方法:
---- 1、用户输入的方法:
---- Web表单:
---- Web表单(Form)提供了一种与用户进行交互的方法。它使用"打包"的技术,以收集用户的输入,触发网络服务器的行为,获取用户的响应,功能类似于Windows中的对话框。
---- 表单使用
和
标识定义了一个组成表单的HTML网页的区域。当选择了表单中的Submit按钮,两个标识之间的数据输入就被作为一组发送到服务器。典型的设计如下所示:
< form ACTION="input.dll" METHOD="POST" >
< input TYPE="hidden" NAME="MfcISAPICommand" value="Input" >
.
< input [attribute-list] >
.
< input TYPE="submit" value="OK" >
< input TYPE="reset" value="Reset" >
< /form >
---- 其中"ACTION"属性指定了ISAPI DLL在服务器上的存放位置。"METHOD"属性指出了数据将被传送到服务器的方式:如果是"GET"方式,数据就作为URL的一部分被编码并发送到服务器;如果是"POST"方式,数据就作为消息的主体被发送。
---- < input >标识符用于从用户收集输入,输入类型由"TYPE"属性决定。由标识符支持的输入类型如下:
¨ 文本输入
¨ 口令输入
¨ 单选按钮
¨ 复选框
¨ 图象输入
¨ 隐藏域
¨ 提交按钮
¨ 重置按钮
---- 这些输入单元都有以下的形式:
< input type="text" name="EquipName" value="MSC" >
---- "name"是给输入单元一个标识,这个标识将作为ISAPI DLL中响应函数的参数。"type"是输入单元的类型,用以区分以上几种输入单元。"value"设置输入单元的初始值。
---- 注意上面的HTML源程序,在类型为"hidden"的输入单元中,定义了服务器端响应此用户输入的函数名。而类型为"submit"和"reset"的两个输入单元是两个按钮,当用户按下"submit"按钮,系统就将输入的内容发送到服务器端;当用户按下"reset"按钮,系统就将用户输入的内容重置为原来的默认值,以便重新输入。