ISAPI与CGI的比较及其实现

123 篇文章 1 订阅
85 篇文章 0 订阅
摘要:本文介绍了实现web交互的两种方法,CGI及ISAPI。对它们的原理、实现方法作了阐述,并就它们的性能
进行了比较。最后简单介绍了ISAPI应用的具体实现。
关键词:WEB交互CGIISAPI
一、引言
ISAPI与CGI都属于通用的网关接口,主要用来实现WWW服务器与客户端的信息交互。
随着WWW爆炸式的发展及其日益普及,人们的眼光已被充斥其上的商机所吸引。在WWW上求取经济利益的方式主
要有以下几种:
通过为企业等作广告宣传收取广告费;
向入网观看者收取订阅费;
直接在网上出售商品和服务。
目前大多数网站提供信息的方式是由用户通过客户浏览器(如Netscape或Explorer等)与WWW服务器连接,然后
用鼠标点按超连接以浏览相关主页。在此过程中,基本上是服务器向客户端单方向的信息传递,随着服务需求
的不断扩大,这种单纯的单方向传递信息的静态主页已不能满足需求。不论是服务提供方还是客户,都希望浏
览服务器将信息发送到用户同时,用户端也能将信息发送到服务器端,实现服务器与客户的交互。典型的应用
如:用户登记表、用户留言板以及用户通过WWW检索服务器端的数据库等。
要实现一个可与用户交互信息的服务系统,所需增加的有两项:交互式主页和用户输入信息处理程序。交互式
主页即有输入信息的编辑框,选择菜单按钮之类的主页,以供用户输入信息;用户输入的信息则交由用户信息
处理程序处理。实现该程序可以有多种途径,该程序可以放在服务器端,也可以放在客户机端,前者如CGI、
ISAPI,后者如JAVAAPPLET等。本文只讨论前者,将阐述ISAPI的优点,并就其实现举例说明。
二、WEB交互环境的实现
2.1交互式主页
要实现WEB上的交互环境,用户必须能够在他浏览到的主页上输入信息,这就是一个交互式的主页。一般来说,
用户输入信息的形式有填写编辑框,点选无线按钮等选择框及选择下拉菜单等,所以交互主页也必须有这些输
入元素项。下面是一个简单的交互主页例子:
交互式主页HTML源文件:isapi1.htm
「HTML」
「TITLE」TEST「/TITLE」
「HEAD」
ISAPITEST
「/HEAD」
「BODY」
「formaction="/gjy/isapi1/debug/isapi1.dll?RegisterUser"method=post」
InputyourRegisterInfomation:「br」
Name:「inputtype="text"name="First"」「br」
Address:「inputtype="text"name="Middle"」「br」
Email:「inputtype="text"name="Last"」「br」「p」
「inputtype="submit"」
「inputtype="reset"」「/p」
「/form」
「/body」
「/html」
通过Explorer浏览器打开该文件,可以看到如下效果(编辑框中已输入内容):
2.2实现交互主页的途径。
从上述主页制作描述可见,一个交互式主页的制作是很简单的,但要真正实现与用户的交互,还必须要有应用
程序的参与。这个程序可以属于多种样式,如CGI、JAVAAPPLET以及ISAPI。在上述主页文件中,有一项:
「formaction="/gjy/isapi1/debug/isapi1.dll?RegisterUser"method=post」
这里就指明了对应处理该主页输入信息的程序(isapi1.dll),这是ISAPI的应用程序动态连接库。对于CGI应
用程序也是一样的处理。
一般来说,该程序的功能就是要将用户输入信息传到服务器应用程序。
CGI是大家都比较熟悉的一种实现上述功能的有效途径,也可能是当前最为流行的一种,而ISAPI是微软独特的
具有类似CGI功能的网络应用接口标准。ISAPI在性能上较之CGI具有许多优良特性。下面我们简单介绍一下CGI
与ISAPI以及它们之间的性能差别。
三、CGI原理及其性能
3.1CGI概念
CGI即通用网关接口(CommonGatewayInterface),它是一个WWW服务器
主机对外服务的标准接口,一般来说,一个CGI接口的功能就是在超文本文件和服务器主机应用程序间传递信息。
3.2CGI程序语言
事实上,任何一种程序语言,只要能在服务器主机上利用CGI接口来编写应用程序,都可以叫作CGI程序语言。
目前最为流行的CGI程序语言有四种:C,Shell,Perl和VisualBasic,其它一些语言也有许多人在用,如TCL,
Fortran及AppleScript等。
3.3CGI程序的执行
CGI程序一般是个可执行程序。编译好的CGI程序一般要集中放在一个目录下。具体存放的位置随操作系统的不
同而不同,例如UNIX系统下是放在cgi-bin子目录下,而在Windows操作系统下(注意,这里不包括NT4.0)以
Webstar或Website作WWW服务器,CGI程序都放在cgi-win下。CGI程序的执行一般有两种调用方式:1是通过
URL直接调用,如:“http://202.114.2.182/cgi-win/cgi.exe”,在浏览器的URL栏里直接写入上述描述
就可以调用该程序;另一种方式,也是主要的方式,是通过交互式主页里的FORM栏调用,通常都是用户在填完
一张输入信息主页后按确认按钮启动CGI程序,前面的交互主页就是一个如此调用CGI的典型例子。
3.4CGI工作的主要流程
CGI工作的主要流程是:1.一个用户请求激活一个CGI应用程序;2.CGI应用程序将交互主页里用户输入信息提
取出来;3.将用户输入的信息传给服务器主机应用程序(如数据库查询〕;4.将服务器处理结果通过HTML文件
返回给用户;5.CGI进程结束。
3.5CGI的性能评价
CGI的跨平台性能极佳,几乎可以在任何操作系统上实现,如DOS、WINDOWS、UNIX、OS/2、Macintosh等。实
现CGI的编程语言也有很多选择。CGI的应用程序一般都是一个独立的可执行程序,和WWW服务器各自占据着不
同的进程,而且一般一个CGI程序只能处理一个用户请求。这样,每有一个用户请求,都会激活一个CGI进程,
当用户请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等,造成效能低下。
四、ISAPI原理及其性能
4.1ISAPI概念
ISAPI即InternetServerApplicationProgramInterface,是微软提供的一套面向Internet服务的API接口,
它能实现CGI能提供的全部功能,并在此基础上进行了扩展,如提供了过滤器应用程序接口。
4.2ISAPI程序语言
由于开发ISAPI应用要用到微软的一套API,所以能用来开发ISAPI应用的语言不如CGI那么多。主要有
VisualC++4.1以上版本,VisualBasic5.0、BorlandC++5.0也可以。
4.3ISAPI原理
ISAPI的工作原理和CGI大体上是相同的,都是通过交互式主页取得用户输入信息,然后交服务器后台处理。
但是二者在实现机制上大相庭径。ISAPI与CGI最大的区别在于:不同于CGI,在ISAPI下建立的应用程序是以
动态连接库的形式存在;而CGI的应用程序一般都是可执行程序。
4.4ISAPI程序的执行
ISAPI应用的工作流程与CGI有一些不同。ISAPI应用的DLL不仅可以象CGI程序一样被用户请求激活,还可以被
系统预先激活来监视用户输入;对于被用户激活的DLL,在处理完一个用户请求后不会马上消失,而是继续驻
留在内存中等待处理别的用户输入,直到过了一段时间后一直没有用户输入。
4.5ISAPI性能评价
一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个
用户请求处理函数,此外,ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。
不过ISAPI的平台兼容性较差,目前只能用于微软自己的Windows95和NT操作系统上,服务器平台也仅限于IIS
(InternetInformationServer)和MSpersonalwebserver以及NTworkstation上的peerwebserver。
五、ISAPI的实现
能够支持ISAPI开发的平台只有微软的几个平台组合(如NT+IIS,WIN95+MSpersonalwebserver)。因此开发
ISAPI只能这几个平台上。开发语言前已有述,这里向大家推荐VisualC++4.2版,它的Wizard提供了专门制作
ISAPI的功能项。
下面是个简单的例子,功能是将用户从浏览器上的输入简单地回显给用户,功能简单,但是具备一个典型的
ISAPI全部流程。源程序如下(大部分为Wizard生成的代码):
1.主程序:
// ISAPI1.CPP - Implementation file for your Internet Server
#include "stdafx.h"
#include "isapi1.h"
///
// The one and only CWinApp object
// NOTE: You may remove this object if you alter your project to no
// longer use MFC in a DLL.
CWinApp theApp;
///
// command-parsing map
BEGIN_PARSE_MAP(CIsapi1Extension, CHttpServer)
/************* My codes begin here ***********/
ON_PARSE_COMMAND(RegisterUser,
 CIsapi1Extension, ITS_PSTR ITS_PSTR ITS_PSTR)
ON_PARSE_COMMAND_PARAMS("First Middle Last")
/************* My codes end here ***********/
END_PARSE_MAP(CIsapi1Extension)
///
// The one and only CIsapi1Extension object
CIsapi1Extension theExtension;
///
// CIsapi1Extension implementation
CIsapi1Extension::CIsapi1Extension()
{
}
CIsapi1Extension::~CIsapi1Extension()
{
}
BOOL CIsapi1Extension::GetExtensionVersion
           (HSE_VERSION_INFO* pVer)
{
// Call default implementation for initialization
CHttpServer::GetExtensionVersion(pVer);
// Load description string
TCHAR sz[HSE_MAX_EXT_DLL_NAME_LEN+1];
ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
IDS_SERVER, sz, HSE_MAX_EXT_DLL_NAME_LEN));
_tcscpy(pVer->lpszExtensionDesc, sz);
return TRUE;
}
///
// CIsapi1Extension command handlers
/****** My code begins here**********/
void CIsapi1Extension::RegisterUser
           ( CHttpServerContext* pctxt, LPCTSTR
pstrFirst, LPCTSTR pstrMiddle, LPCTSTR pstrLast )
{
// do processing here!
*pctxt << _T("Your name is:");
*pctxt << _T(pstrFirst);
*pctxt << _T("\n");
*pctxt << _T("Your Address is:");
*pctxt << _T(pstrMiddle);
*pctxt << _T("\n");
 *pctxt << _T("Your E_mail is:");
*pctxt << _T(pstrLast);
}
/********* My codes end here **********/
// Do not edit the following lines, 
           which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CIsapi1Extension, CHttpServer)
//{{AFX_MSG_MAP(CIsapi1Extension)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif// 0
2. 主 头 文 件
// ISAPI1.H - Header file for your Internet Server
//isapi1 Extension
#include "resource.h"
class CIsapi1Extension : public CHttpServer
{
public:
CIsapi1Extension();
~CIsapi1Extension();
// Overrides
// ClassWizard generated virtual function overrides
// NOTE - the ClassWizard will add and remove member functions here.
//DO NOT EDIT what you see in these blocks of generated code !
//{{AFX_VIRTUAL(CIsapi1Extension)
public:
virtual BOOL GetExtensionVersion(HSE_VERSION_INFO* pVer);
//}}AFX_VIRTUAL
// TODO: Add handlers for your commands here.
 /*********** My coded begin here ( 函 数 声 明) *********/
 void RegisterUser( CHttpServerContext* pctxt, 
               LPCTSTR pstrFirst, LPCTSTR 
pstrMiddle, LPCTSTR pstrLast );
 /*********My codes end here
DECLARE_PARSE_MAP()
//{{AFX_MSG(CIsapi1Extension)
//}}AFX_MSG
};
3. 动 态 连 接 库 定 义 文 件
/*************************************/
/*ISAPI1.def */
/*************************************/
; ISAPI1.def : declares the module parameters for the DLL.
LIBRARY"ISAPI1"
EXPORTS
HttpExtensionProc
GetExtensionVersion

在上述程序中,定义了一个CHttpServer的类CIsapi1Extension,这是该程序的主要一个类,通过它实现与用
户交互的功能。由ON_PARSE_COMMAND段实现函数映射,上述程序中定义了该DLL中的一个成员函数
RegisterUser,其功能就是将用户在编辑框中输入的信息发送回用户。关于具体实现细节,可以参看VC4.2
帮助文档。将上述文件编译成DLL后放入服务器主机内WWW服务器指定的用户有执行权限的Scripts目录里,该目
录的逻辑名应和交互主页里的一致。设置完后,通过浏览器连到服务器上,浏览该主页,并输入信息到编辑框中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值