了解一下ISAPI(Internet Server API)在Microsoft产品中处于什么位置,对于理解它本身不无帮助。实际上Visual C++提供了五个层次的支持,其中三个层次位于服务器上。另外两个层次支持是客户机专用的──你永远不会在服务器上看到它们。下面将逐一定义各个层次支持并告诉你到哪里去找到它们。
ISAPI(服务器) 这是本章要讨论的支持层。你需要给服务器本身提供一个扩展或过滤器。也就是说,客户机不会直接与该层次支持打交道。它只能看到交互的结果。
WinInet(服务器或客户机) 本书不直接涉及该支持层次,但确实会间接地涉及到它。这些类允许你在客户机和服务器之间使用专用的数据传送方法。其中包含三种协议支持:HTTP、FTP和Gopher。从本质上看,你需要用这些类来创建一个会话(CInternetSession),它是服务器的一个连接,然后指定连接类型(CFtpConnection或者CHttpConnection)。建立连接后,你就可以进行工作了,比如查找文件等(CFtpFileFind或GopherFileFind)。通常你不必直接与这些类打交道,因为Visual C++已经做好了一切,就像第12章创建URL moniker应用程序时一样。
异步URL moniker(服务器或客户机) 第12章已经介绍了Visual C++ 的Internet支持的特定领域。要记住的是异步URL moniker允许你在Internet上完成任务而不必等待。只要简单地告诉目标应用程序你想要什么,然后就可以干其它事情了。这里的主要思想是,大部分情况下Internet不提供即时响应,如果不使用异步URL moniker方式,那么对于长时间的下载,会使用户的机器长时间地等待而无所事事。
ActiveX document(客户机) 该层次的支持在浏览器中显示文档并允许用户编辑它。这些内容第11章都已经介绍过了。
ActiveX控件(客户机) 过去创建一个Web页的基本元素要涉及到编写大量的脚本,即使那样,得到的也只是静态的画面。在Web站点上使用ActiveX控件意味着老的技术和静态显示再也不拖你的后腿了──现在的Web 页可以根据具体情况发生变化。第10章介绍的就是该技术。
Web链接 Internet上有许多地方可以获得 IIS 、 ISAPI 以及其它与Internet服务器有关的技术(如Active Server Page( ASP) )。访问IIS 信息的主要站点是 。Microsoft支持的该站点包括了一些链接,它们指向你使用IIS本身所需的一切知识,甚至还有一些公用链接指向使能(Enabling)技术,(例如ISAPI)。如果你想获得非Microsoft的帮助,可以访问位于的ASP开发者站点。它包含许多关于在Internet服务器上使用Active Server Pages的有价值的信息,另外它还有非Microsoft链接指向的IIS和ISAPI站点。
在现实世界中使用ISAPI
在现实世界产品环境中,你需要了解一些与ISAPI有关的事情。例如,你的ISA是要装入服务器的一个DLL,这与其它DLLxx一样。该DLL将与HTTP服务器共享同一地址空间,如果需要把该DLL占用的内存用于其它用途,还可以卸载这个DLL。正是由于这一点,ISAPI才赢得了你的青睐。与其它技术(如CGI)比较起来,使用ISA有诸多好处,下面逐一予以介绍。
内存占用少 由于ISA是作为DLL装在服务器上的,并和HTTP服务器共用同一内存空间,所以不必浪费那些使用CGI时用到的内存。你真正要装载的只是要求ISA完成任务所需的业务逻辑。
速度 {dy}次装载DLL与{dy}次装载C应用程序所花费的时间基本相同,尽管DLL 因为较小可能要快一些。不过,一旦{dy}次装载了DLL后,它就常驻内存直至卸载它,这就意味着可以不必再花费装载时间。而CGI脚本是每次调用时都装载一次C应用程序。这可不是好消息。因为ISA DLL与HTTP服务器共享同一内存空间,就不会为进程间调用浪费时间了,也不会遇到在不同地址空间中使用C 应用程序时遇到的其它时间耗费问题。
代码共享 服务器的任务就是一次性装入你的DLL。申请DLL服务的任意应用程序都可以访问它。显然,代码共享是导致前两点中提到的对CGI 进行改进来获得低内存消耗和提高速度的因素之一,而且,代码共享还带来不那么明显看到的益处。例如,代码共享减少了服务器的管理时间,因为管理员只需要对给定的DLL 再产生一个副本去影响使用它的每一个应用程序。CGI通常使用的C应用程序有大量的冗余代码,改变一个单一例程,就需要对服务器上使用该例程的每一个C应用程序进行改变。这就意味着增加管理员的时间和程序员追踪附加应用程序的需求。
可靠性 CGI脚本使用的C应用程序在装入服务器并在服务器上执行时,并没有对服务器本身作多少访问。因此,就难以创建一个C应用程序来监督服务器事件并从出错中恢复。通常服务器总是终止出了错的CGI,而客户机却什么也不知道。ISA拥有对服务器的xx访问,这就是说它们可以更容易地从出错中恢复。于是,客户机二次申请服务器的情况(即使有的话)非常少见。
过滤能力 使用CGI和C应用程序,你不能提供与ISA一样的事件驱动功能。原因很简单:C应用程序是被调用、做工作、然后卸载。所以它没有办法长时间一直监视服务器事件。
在一个DLL中的多任务能力 要CGI完成的每个任务都需要你有完成每个任务的单独的可执行程序。结果导致过度调用每个例程。而 ISA 却能包含多个命令,每个命令是CHttpServer类的一员。
获得这六项功能并不意味着在学习或写出代码方面付出昂贵代价。ISA就像CGI一样好用。下面两行代码看上去就像是在应用程序中的代码一样。
<!-这是带有一个参数CGI例程的调用。->
<!-这是带有一个参数ISA例程的调用。->
可以看出操作ISAPI一点也不难。我们使用了与调用CGI例程几乎xx一样的代码来调用ISA 控件。实际上,从编码角度来看,{wy}的不同就是ISA控件使用DLL扩展名,而CGI 例程使用EXE扩展名。从理论上来说,你可以将服务器转换为ISA,对Web 页面作些检索替换性的修改,这从用户界面角度几乎看不出什么区别。当然,每个人都会注意到,因为使用 ISAPI会带来Web站点的xxx率。
上面我提到的使用ISA的{zh1}一个好处是,你可以用一个ISA完成多个任务。稍后将会介绍如何实现这种机制。现在你只需要知道,调用语法与以前调用标准CGI 没什么太多不同。下面就是一个ISA例程调用,它指明了你要使用DisplayStr函数。
<!- 用一个参数在一个ISA例程中调用DisplayStr函数。->
可以看出,在调用串中,我们使用第二个问号(?)调用了缺省任务之外的某种东西。{dy}个参数告诉服务器在SAMPLE.DLL中要调用哪个函数,第二个参数则包含一系列参数。这种调用函数的方法称为分析映射,本章“创建ISAPI扩展”一节将对如何创建它们作进一步介绍。
注 给调用语法再加第二个问号就可以在ISA中调用缺省函数之外的东西。
ISA确实还有一些与CGI相同的特性。例如,应用程序是在服务器而不是客户机上运行的。这就使升级应用程序变得很容易──你要做的工作只是在服务器上更换一个DLL 文件(一定要终止服务才能更新DLL,不过这是方便地对机器进行更新所需付出的最小代价)。显然,这比在访问Web站点的每个客户机上都替换一个应用程序要容易多了。这也正是目前各家公司都开始重视把内部网作为承担像帮助系统和定制数据库应用程序这样的主要任务的原因之一:更新一个服务器比更新许多客户机要容易得多。
注 ISA在服务器上运行,意味着每次更新一个定制应用程序时只需更新服务器而不用更新各个客户机。
技巧 IIS第4版添加了一些新功能,使得ISA更容易使用。例如,可以让服务器在每次调用之后就卸载ISA。这意味着你能试试ISA,看它能否工作,如有必要,用新版本去替换一下,而这一切都是在不停止服务的条件下进行的。这一新功能的不足之处是,由于每当客户机调用ISA时,服务器都需要重载它,这样,就带来一些操作问题。
在过滤器与扩展之间进行抉择
你不必花太多时间就可以决定出是创建ISA过滤器还是创建ISA扩展(或者两个都创建)。这两种ISA之间的区别很明显。知道它们的差别后选择所需的ISA就是件简单的事了。
过滤器总是对服务器本身的事件作出反应。如果用户试图登录Web站点,就会生成ISA过滤器能监测到的一个事件。通常用过滤器来修改客户机与服务器之间的数据流。例如,如果应用程序发现有SF_NOTIFY_AUTHENTICATION事件发生,就可以显示一个对话框,要求用户输入名称和口令。如果名称和口令都正确,用户即可获得对Web站点的访问权。
扩展适用于CGI同样的情形。例如,如果想创建一个订货系统,就可以使用扩展。扩展将接收用户填入窗体中的数据,处理信息并将它们加入数据库,{zh1}将某种形式的收据发还给用户。这正是使用CGI脚本时遵循的同一过程;{wy}的区别是现在使用的是DLL。与过滤器不同,扩展不监测服务器上的事件,无论从哪一方面看它都像应用程序那样工作。
还有一些情况,不管选择过滤器还是扩展都没什么关系。例如,考虑一个简单的Web 计数器。每次有人访问Web站点时,都更新计数器并显示它们是第几位访问者。如果愿意的话,你可以从Web页面上调用ISA扩展来更新计数器,也可以用过滤器监测服务器上的SF_NOTIFY_LOG事件并自动发送信息。这只是个人喜好问题。
注 像访问计数器这类的ISA应用程序,我们既可以选择创建过滤器,也可选择创建扩展。
你可能还会遇到需要同时使用扩展和过滤器的情形。例如,你可能想为授权的Netscape用户显示一种Web页,而给非授权Netscape用户显示另一种Web页。针对授权的和非授权的Internet Explorer用户也有两个Web页。这种情况下需要在HTML格式中编写一些脚本来检测浏览器类型,需要用过滤器来检查用户是否授权,还需要用扩展来生成正确的页面。在服务器中将客户机脚本和ISA扩展进行组合,将大大丰富你的Web站点并使它便于每个人使用。
注 某些ISA应用程序(如专用的浏览器支持),要求创建既包括过滤器又包括扩展的复杂的DLL。
使用ISAPI的五个类
前面已经说过本章将使用五个新的MFC类。这并不是说你不再使用那些以前已经熟悉的类了,不过这些类确实能提供设计ISA过滤器或扩展所需的特殊功能。下面将对下面章节中要用的这些类作简单的介绍。显然在开始设计真正的示例代码时你的了解会更深入一些的。
CHttpServer 这是创建过滤器或扩展所需的主要类。CHttpServer类定义了一个作为服务器扩展DLL或ISA的对象。该CHttpServer 对象的主要目的是处理由