荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: ISAPI与CGI的比较及其实现
发信站: BBS 荔园晨风站 (Thu Jan 21 23:08:19 1999), 转信


  ISAPI与CGI都属于通用的网关接口,主要用来实现WWW服务器与客户
端的信息交互。
    目前大多数网站提供信息的方式是由用户通过客户浏览器(如Net
scape或Explorer等)与WWW服务器连接,然后用鼠标点按超链接以浏览
相关主页。在此过程中,基本上是服务器向客户端单方向的信息传递,
随着服务需求的不断扩大,这种单方向传递信息的静态主页已不能满
足需求。不论是服务提供方还是客户,都希望服务器能将信息发送到
用户,同时用户端也能将信息发送到服务器端,实现服务器与客户的交
互。典型的应用如:用户登记表、用户留言板以及用户通过WWW检索服
务器端的数据等。
    要实现一个交互的服务系统,所需增加的有两项:交互式主页和用
户输入信息处理程序。交互式主页含有输入信息的编辑框、选择菜单
按钮等,以供用户输入信息;用户输入的信息则交由用户信息处理程序
处理。实现该程序可以有多种途径,该程序可以放在服务器端,也可以
放在客户机端,前者如CGI、ISAPI,后者如Java Applet等。本文只讨
论前者。
    WEB交互环境的实现
    要实现WEB上的交互环境,用户必须能够在所浏览的主页上输入信
息,这就是一个交互式的主页。一般来说,用户输入信息的形式有填写
编辑框、点选无线按钮等选择框及选择下拉菜单等,所以交互主页也
必须有这些输入元素项。下面是一个简单的交互主页例子:
    <! --交互式主页HTML源文件:isapi1.htm -->
    <html>
    <title> TEST </title>
    <head>ISAPI TEST</head>
    <body>
    <form action="/gjy/isapi1/debug/isapi1.dll?RegisterUser"
method=post>
    Input your Register Infomation:<br>
    Name   :<input type="text" name="First"><br>
    Address:<input type="text" name="Middle"><br>
    Email  :<input type="text" name="Last"><br><p>
    <input type="submit">
    <input type="reset" ></p>
    </form></body></html>
图1
    通过Explorer浏览器打开该文件,可以看到如下效果(编辑框中已
输入内容):
    由此可见,一个交互式主页的制作是很简单的,但要真正实现与用
户的交互,还必须要有应用程序的参与。这个程序可以属于多种样式,
如CGI、Java Applet以及ISAPI。在上述主页文件中,有一项:   <for
m action="/gjy/isapi1/debug/isapi1.dll?RegisterUser" methd =
post>这里就指明了处理该主页输入信息所对应的程序(isapi1.dll),
这是ISAPI的应用程序动态链接库。对于CGI应用程序也是类似。

    CGI原理及其性能
    CGI即通用网关接口(Common Gateway Interface),它是一个WWW
服务器主机对外服务的标准接口,一般来说,一个CGI接口的功能就是
在超文本文件和服务器主机应用程序间传递信息。
    任何一种程序语言,只要能在服务器主机上利用CGI接口来编写应
用程序,都可以叫做CI 程序语言。目前最为流行的CGI程序语言有四
种:C、Shell、Perl和Visual Basic,其它一些语言也有许多人在用,
如TCL、Fortran及AppleScript等。
     CGI程序一般是可执行程序。编译好的CGI程序一般要集中放在
一个目录下。具体存放的位置随操作系统的不同而不同(而且可以由
用户根据自己情况进行配置),例如UNIX系统下一般放在cgi-bin子目
录下,而在Windows操作系统下(注意,这里不包括NT4.0)以Webstar或e
bsite作WWW服务器,CGI程序都放在cgi-win下。CGI程序的执行一般
有两种调用方式:一是通过URL直接调用,如:"http://202.114.2.182/
cgi-win/cgi.exe",在浏览器的URL栏里直接写入上述地址就可以调用
该程序;另一种方式,也是主要的方式,是通过交互式主页里的FORM栏
调用,通常都是用户在填完一张输入信息主页后按"确认"按钮启动CGI
程序,前面的交互主页就是一个如此调用CGI的典型例子。
    CGI工作的主要流程是:1.一个用户请求激活一个CGI应用程序;2.
CGI应用程序将交互主页里用户输入信息提取出来;3.将用户输入的信
息传给服务器主机应用程序(如数据库查询; 4.将服务器处理结果通
过HTML文件返回给用户;5.CGI进程结束。
    CGI的跨平台性能极佳,几乎可以在任何操作系统上实现,如DOS、
Windows、UNIX、OS/、Macintosh等。实现CGI的编程语言也有很多选
择。CGI的应用程序一般都是一个独立的可执行程序,和WWW服务器各
自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求。
这样,每有一个用户请求,都会激活一个CGI进程,当用户请求数量非常
多时,会大量挤占系统的资源,如内存、CPU时间等,造成效能低下。

    ISAPI原理及其性能
    ISAPI即Internet Server Application Program Interface,是
微软提供的一套面向It ernet服务的API接口,它能实现CGI提供的全
部功能,并在此基础上进行了扩展,如提供了过滤器应用程序接口。
    由于开发ISAPI应用要用到微软的一套API,所以能用来开发ISAPI
应用的语言不如CGI那么多。主要有Visual C++ 4.1以上版本,也可以
使用Visual Basic 5.0、Borland C++5.0等。
    ISAPI的工作原理和CGI大体上是相同的,都是通过交互式主页取
得用户输入信息,ISAP与CGI的比较及其实现然后交服务器后台处理。
但是二者在实现机制上大相径庭。ISAPI与GI最大的区别在于:在ISAP
I下建立的应用程序是以动态链接库的形式存在;而CGI的应用程序一
般都是可执行程序。
    ISAPI应用的工作流程与CGI有一些不同。ISAPI应用的DLL不仅可
以像CGI程序一样被用户请求激活,还可以被系统预先激活来监视用户
输入;对于被用户激活的DLL,在处理完一个用户请求后不会马上消失,
而是继续驻留在内存中等待处理别的用户输入,直到过了一段时间后
一直没有用户输入。
    一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的
另一个请求,还可以在一个DLL里设置多个用户请求处理函数。此外,I
SAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于C
GI。
    不过ISAPI的平台兼容性较差,目前只能用于微软自己的Windows
NT操作系统上,服务器平台也仅限于IIS(Internet Information Serv
er)和MS Personal Web Server以及NT Wors tation上的Peer Web Se
rver。

    ISAPI的实现
    下面是个简单的例子,功能是将用户从浏览器上的输入简单地回
显给用户,十分简单,但是具备一个典型的ISAPI全部流程。源程序如
下(这里向大家推荐Visual C++4.2,它的Wizad 可以生成大部分代码)
:

    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)
    ON_PARSE_COMMAND(RegisterUser, CIsapi1Extension, ITS_PST
R ITS_PSTR ITS_PSTR
    )
    ON_PARSE_COMMAND_PARAMS("First Middle Last")
    END_PARSE_MAP(CIsapi1Extension)
    // The one and only CIsapi1Extension object
    CIsapi1Extension theExtension;
    // CIsapi1Extension implementation
    CIsapi1Extension::CIsapi1Extension()
    {
    }
    CIsapi1Extension::~CIsapi1Extension()
    {
    }
    BOOL CIsapi1Extension::GetExtensionVersion(HSE_VERSION_I
NFO* pVer)
    {
    // Call default implementation for initialization
    CHttpServer::GetExtensionVersion(pVer);
    // Load description str
    TCHAR sz [HSE—MAX—EXT—DLL—NAME—LEN+1];
    ISAPIVERIFY(::LoadString(AfxGetResourceHandle(), IDS_SER
VER, sz, HSE_MAX_EX T_DLL_NAME_LEN));
    _tcscpy(pVer->lpszExtensionDesc, sz);
    return TRUE;
    }
    // CIsapi1 Extension command handlers
    void CIsapi1Extension::RegisterUser( CHttpServerContext*
pctxt, LPCTSTR
    pstrFirst, LPCTSTR pstrMiddle, LPCTSTR pstrLast )
    {
    *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);
    }
    // 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.def   */
    ; ISAPI1.def : declares the module parameters for the DL
L.
    LIBRARY  "ISAPI1"
    EXPORTS
    HttpExtensionProc
    GetExtensionVersion
    在上述程序中,定义了一个CHttpServer的类CIsapi1Extension,
这是该程序主要的一个类,通过它实现与用户交互的功能。而具体调
用DLL中的函数由ON_PARSE_COMMAND实现,上述程序中定义了该DLL中
的一个成员函数RegisterUser,其功能就是将用户在编辑框中输入的
信息发送回用户。关于具体实现细节,可以参看VC4.2帮助文档。
    将上述文件编译成DLL后放入WWW服务器指定的用户有执行权限的
Scripts目录里,该目录的逻辑名应和交互主页里的一致。设置完后,
通过浏览器连到服务器上,浏览该主页,并输入信息到编辑框,按"确定
"按钮就可看到如下结果:
图2

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店