发信人: skyice()
整理人: skyice(2000-03-16 13:44:04), 站内信件
|
在csdn的邮件列表中见到此文,觉得有点意思,贴来共同欣赏
★ MFC ISAPI 编程探讨
作者:山东移动通信公司 郭彬
摘要:本文通过对CGI和ISAPI的对比以及对ISAPI的工作原
理的分析,阐述了使用MFC ISAPI编程的一般方法。
主题词:MFC ISAPI CGI
CSDN网友文集:www.midatech.com/csdn/fdoc/gb001.htm
正文:
一、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 "123"将被解析出来存放到各自的数据结构中。
解析映射系统还有另外一个功能:ISAPI 可以把请求传递
给 ISA内特定的成员函数。请求字符串可以包含一个命令,解
析映射表就使用该命令把请求传递给ISA内正确的成员函数。
三、MFC 的 ISAPI 编程方法:
1、用户输入的方法:
Web 表单:
Web 表单(Form)提供了一种与用户进行交互的方法。它使
用“打包”的技术,以收集用户的输入,触发网络服务器的行
为,获取用户的响应,功能类似于Windows中的对话框。
表单使用 <Form> 和 </Form>标识定义了一个组成表单的
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"按钮,系统就将用户输入的内容重置为原来的
默认值,以便重新输入。
超级连结:
用户也可以使用超级连结的方法来激活一个ISAPI DLL。
如下所示:
<a href="browser.dll?mfcISAPICommand=Browser">Browser
这里,隐含地采用了"GET"的方式。在href中指明了ISAPI
DLL的模块名和具体的函数名。当用户点中了这个超级联结,
系统就会将用户的请求发送到服务器。
2、MFC 中对用户数据输入的响应方法:
从发布开始,MFC(Microsoft Foundamental Classes,
微软基础类库)就被认为是开发 Windows 应用程序的标准平
台。通过提供更清晰、更简单的Windows API接口,MFC 可以
帮助开发者更快、更简单地编写程序。
MFC中支持ISAPI的类有:
¨ CHttpServer
¨ CHttpServerContext
¨ CHttpFilter
¨ CHttpFilterContext
¨ CHtmlStream
用户可以方便地使用"ISAPI Extention Wizard" 来生成
一个ISAPI DLL的基本框架,然后只要添加自己需要的函数就
可以了。
HTML 的用户输入和命令处理例程是通过一个叫做 "MFC
PARSEMAP"的数据结构来实现解析映射的。在生成的框架中,
可以看到形如以下的源程序:
BEGIN_PARSE_MAP(CBrowserExtension, CHttpServer)
ON_PARSE_COMMAND(Browser,CBrowserExtension,ITS_EMPTY)
DEFAULT_PARSE_COMMAND(Browser, CBrowserExtension)
ON_PARSE_COMMAND(Query, CBrowserExtension, ITS_PSTR)
ON_PARSE_COMMAND_PARAMS("OfficeName")
END_PARSE_MAP(CBrowserExtension)
它们的含义如下:
BEGIN_PARSE_MAP(CBrowserExtension, CHttpServer)和
END_PARSE_MAP(CBrowserExtension):
定义PARSEMAP的开始和结束。并且指出本DLL所使用的类
名及其基类名(一般是CHttpServer)。
ON_PARSE_COMMAND(funcName,className,paramList)
定义支持服务器侧接收用户输入的一个函数,以及它所接
受的参数。该函数与 WEB 表单的隐含输入域中定义的"value"
值要一致。用户只要编写此函数,就可以实现对用户输入的响
应。必须要保证这里定义的参数与 WEB表单中定义的输入单元
是一一对应的。
ParamList 是一个或多个代码定义的函数的参数列表,可
用的代码如下:
代码 含义 C++中与之对应的数据类型
ITS_PSTR 字符串 LPCSTR或char * const
ITS_I2 2字节整数 Int
ITS_I4 4字节整数 long int
ITS_R4 4字节浮点数 Float
ITS_R8 8字节浮点数 Double
ITS_EMPTY 空的参数列表
ON_PARSE_COMMAND_PARAMS
该宏定义参数的名称,注意要与HTML的表单中各个输入单
元的"name"值保持一致。
DEFAULT_PARSE_COMMAND
用于指定如果浏览器传送的表单或超级连结中没有包含一
个函数名时,被DLL缺省调用的函数名。
3、响应函数的结构:
响应函数形如以下结构:
void CBrowserExtension::Browser(CHttpServerContext* pCtxt,…)
{
StartContent(pCtxt);
*pCtxt << "<p>Hello World !</p>";
//其它的处理。
EndContent(pCtxt);
}
响应函数总是以 StartContent(pCtxt) 函数开始,以
EndContent(pCtxt)函数结束。*pCtxt的作用是向用户端传
送数据。
服务器可以对输入参数进行相应处理,并将处理结果以
HTML的形式发送回用户端。所以要在此函数中,要将需要在
用户端显示的整个网页的HTML源代码发送过去。虽然略显麻
烦,但增加了灵活性,可以按照用户的输入来动态地生成各
式各样的网页。
使用ISAPI,可以使得静止的网页立刻变得丰富多彩起来!
参考书目:《ISAPI实用技术指南》 清华大学出版社
本文作者:郭彬
联系地址:山东省济南市经三路77号山东移动通信公司(250001)
联系电话:0531-6052168
E-mail: [email protected]
-- 欢迎您到C语言版来!
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.99.91.188]
|
|