⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 210.htm

📁 探索Windows 2000发展策略以及中介层技术设计的基本概念
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<html><body><span  id=Layer1><p><font size=2 color=#3c3c3c face=arial>若说迄今为止,大部份的分散式应用程式都能允许透过浏览器来存取,这是一种很恰当的说法。因为浏览器已成为一种无所不在的工具,所以让应用程式可透过Web存取潜在的意思便是能允许每个人使用。同样地,也因为网际网路已经无所不在,这个样子所带来的好处便是能让你从任何地方存取。虽然使用DCOM建立自订的客户端应用程式来与远端伺服器上的商业逻辑沟通这种情形仍然普遍存在,但是透过浏览器存取已变为一种理所当然、义不容辞的选择。</span><span  id=Layer2></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>大部份应用程式必需允许透过浏览器存取</span><span  id=Layer3></font></p><hr><p><font size=2 color=#3c3c3c face=arial>Web存取的基本模型并非特别复杂。客户端(典型的浏览器,如Microsoft Internet Explorer)传送要求到Web伺服器(如Microsoft Internet Information Services 5.0,IIS,内含在Microsoft Windows 2000之中的Web伺服器)。这些要求都是透过Hypertext Transfer Protocol (HTTP) 传送。Web伺服器便以一连串资讯回应,同样是透过HTTP传送,然後使用Hypertext Markup Language (HTML) 。</span><span  id=Layer4></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>浏览器透过HTTP 存取Web伺服器,取回以HTML标注的资讯</span><span  id=Layer5></font></p><hr><p><font size=2 color=#3c3c3c face=arial>然而较复杂的部份是在於,从Web伺服器回传资讯的方式可能有很多种。若使用的是IIS伺服器,它所回传的资讯可能由许多的资源而来,如图10-1所示。这些资源包含:</span><span  id=Layer6></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;一般的档案</span><span  id=Layer7>&nbsp;</b></font>这些档案包含HTML,IIS读取这些档案,然後传送到浏览器。这些档案中的HTML也可以包含简单的内嵌程式,通常称之为script。这些script以非常简单的开发语言撰写,诸如JavaScript与Microsoft VBScript。当浏览器取得这些script时便进行执行的动作。</span><span  id=Layer8></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Common Gateway Interface</span><span  id=Layer9>&nbsp;</b></font>(</span><span  id=Layer10><font size=2 face=arial color=#3e80d7><b>&nbsp;CGI</span><span  id=Layer11>&nbsp;</b></font>)</span><span  id=Layer12><font size=2 face=arial color=#3e80d7><b>&nbsp;应用程式</span><span  id=Layer13>&nbsp;</b></font>CGI是一开始应用在Web伺服器与应用程式介面间最广泛使用的技术。通常一个CGI应用程式是以Perl或C++这样的程式撰写的,你可以从客户端传送参数,然後因应客户端的要求,动态地产生HTML与其它的资讯回传之。针对每个客户端提出的要求,CGI会产生一个新的行程以便处理这个要求。</span><span  id=Layer14></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Internet Server API</span><span  id=Layer15>&nbsp;</b></font>(</span><span  id=Layer16><font size=2 face=arial color=#3e80d7><b>&nbsp;ISAPI</span><span  id=Layer17>&nbsp;</b></font>)</span><span  id=Layer18><font size=2 face=arial color=#3e80d7><b>&nbsp;延伸程式库与过滤器</span><span  id=Layer19>&nbsp;</b></font>ISAPI和CGI相似的地方在於,从浏览器传送的参数可以透过IIS所实作的一个简单的介面传送到应用程式,再将结果送回浏览器。而不同之处是ISAPI应用程式撰写成DLL的型式,通常以C++撰写,让ISAPI执行更有效率,但同样它也难以撰写。</span><span  id=Layer20></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Active Server Page</span><span  id=Layer21>&nbsp;</b></font>(</span><span  id=Layer22><font size=2 face=arial color=#3e80d7><b>&nbsp;ASP</span><span  id=Layer23>&nbsp;</b></font>)  就和HTML档案可以包含script,传送到浏览器,并透过浏览器执行一样,ASP也可以包含由IIS执行的script。一个ASP网页是一个储存在一般HTML档案中的script,不过它将在伺服器上执行,再将结果传送回浏览器。它们通常都是以相当简单的语言建立的,如VBScript。这些程式从浏览器取得输入的资讯,然後将结果回传,很像CGI应用程式与ISAPI DLL。由於非常容易撰写,ASP俨然为今日最常用在建立IIS应用程式的方法。</span><span  id=Layer24></li><br></font></ul></font><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>IIS支援许多机制,以产生回传到客户端的资讯</span><span  id=Layer25></font></p><hr><br><center><a target=_new href=imagesh/10-1.gif><img border=0 src='imagesl/10-1.gif'></a></center></span><span  id=Layer26><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图 10-1</span><span  id=Layer27>&nbsp;</b></font>IIS回传的资讯可能从许多地方而来的</span><span  id=Layer28></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>最後这叁种选择:CGI应用程式、ISAPI DLL与ASP网页,也可以建立COM物件,并使用COM物件。它们可以存取交易性的COM应用程式,透过ActiveX Data Objects (ADO),经由Active Directory Services Interface (ADSI),Microsoft Message Queuing (MSMQ)等等来储存资料。若要了解上述所有东西运作的原理,那麽从简短的Web基本技术说明开始着手是很有帮助的。</span><span  id=Layer29></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>IIS应用程式可以使用COM物件</span><span  id=Layer30></font></p><hr><a name=210001><font color=#3e70d7 face=arial size=5><b>Web基础概念</span><span  id=Layer31></b></font><p><font size=2 color=#3c3c3c face=arial>Web已快速地风行世界,在西方世界几乎每个人都对它运作的情形具备了基本的概念。不过,了解包含在Windows 2000的服务,以便用来建立Web存取的应用程式还需要比平均水平更多的知识。本章的目标就是提供这些知识。</span><span  id=Layer32></font></p><font color=#3e72d7 face=arial size=4><b>存取HTML档案</span><span  id=Layer33></b></font><p><font size=2 color=#3c3c3c face=arial>现在的学生都知道,存取Web上的资讯只消在浏览器上输入感兴趣的Uniform Resource Locator (URL)。一个URL通常包含通讯协定的名称、Domain Name System (DNS) 伺服器名称,以及一些资源所在的路径,如伺服器上的一个档案。举例来说,若在浏览器上输入URL http://www.qwickbank.com/info.htm,就是要求浏览器先使用DNS找寻对应到 www.qwickbank.com 这台机器的IP位址。(这个步骤展示在</span><span  id=Layer34>&nbsp;<a href=201.htm# target=_new>第一章</span><span  id=Layer35></a>&nbsp;的范例中;为了简单起见,在此不再讨论。) 接着浏览器便使用HTTP存取这台机器,然後回传info.htm档案的内容。这个范例URL的档案名称以.htm结束,指明这个档案中包含HTML。在这个范例中,IIS只需要读取这个档案,然後再将传送回浏览器重新描绘,如图10-2所示。若你已经很熟悉HTML,你将会发现这个简单的范例只显示「An HTML Example」标头,然後在两条水平线之间显示「Hello」这个字。</span><span  id=Layer36></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个URL可以参考到伺服器机器上的HTML档案</span><span  id=Layer37></font></p><hr><br><center><a target=_new href=imagesh/10-2.gif><img border=0 src='imagesl/10-2.gif'></a></center></span><span  id=Layer38><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图10-2</span><span  id=Layer39>&nbsp;</b></font>URL上指定一个要求http://www.qwickbank.com/info.htm让IIS传送回info.htm档案的内容。</span><span  id=Layer40></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>在客户端要求一个内嵌script的HTML档案执行是非常容易的。再次强调,浏览器传送一个URL,指定某台伺服器上的一个HTML档案,这台伺服器回传这个档案,然後浏览器便进行重绘的动作,如</span><span  id=Layer41>&nbsp;<a href="#10-3" target=_new>图10-3</span><span  id=Layer42></a>&nbsp;所示。不同点在於这个档案包含一个script,浏览器将会执行script中的指令,然後显示执行的结果。虽然在此并没有详细描述,图10-3展示的这个简单的script,显示的资讯和上一个范例相同:标头之後的两条水平线之间跟随着一个字「Hello」。</span><span  id=Layer43></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>HTML档案中可以包含在浏览器上执行的script</span><span  id=Layer44></font></p><hr><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>虽然在此没有显示,一个HTML网页也可能要求下载一个称为ActiveX Control的COM元件。它可以在Internet Explorer中执行,与使用者、与网页上的script程式码互动。</span><span  id=Layer45></font></p><hr><a name="10-3"></span><span  id=Layer46><br><center><a target=_new href=imagesh/10-3.gif><img border=0 src='imagesl/10-3.gif'></a></center></span><span  id=Layer47><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图10-3</span><span  id=Layer48>&nbsp;</b></font>IIS所传送的HTML中可以包含script-简单的程式,在浏览器上执行。</span><span  id=Layer49></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>尽管前面已描述,一个URL可能会指定一个不单纯只包含HTML的档案,而是包含某些可执行的程式码。这些程式码的长相则视它为何类的应用程式而定:CGI、ISAPI,或ASP。不过在这些情形下,IIS载入指定的档案,然後应用程式便执行。这些应用程式产生的结果都送交给IIS,这些资讯一般都是包装在HTML中。IIS再将之传送到浏览器重绘。</span><span  id=Layer50></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>URL可以参考到伺服器机器上的应用程式</span><span  id=Layer51></font></p><hr><p><font size=2 color=#3c3c3c face=arial>若要产生结果,应用程式可能需存取资料库,呼叫其它的应用程式,或执行任何必要的处理过程。建立可透过Web存取的应用程式是本章的重头戏,因此稍後再更详细描述。</span><span  id=Layer52></font></p><font color=#3e72d7 face=arial size=4><b>了解HTTP</span><span  id=Layer53></b></font><p><font size=2 color=#3c3c3c face=arial>虽然对HTTP真正运行的情形并非相当地了解,不过你还是有使用到浏览器的可能。也很有可能建立一个愚蠢的Web应用程式,一点也不令人满意。要领会网站开发的基础概念至少需要知道一些关於这个广为使用的协定之资讯。</span><span  id=Layer54></font></p><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b>&nbsp;通讯协定基础概念</span><span  id=Layer55>&nbsp;</b></font>都用在特殊的目的上,可透过浏览器呼叫。Method名称与它的参数将跨越一个TCP连线,以简单的字串传送,同样的结果也会以相同的方法传回来。最令人感兴趣的HTTP method为:</span><span  id=Layer56></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;GET</span><span  id=Layer57>&nbsp;</b></font>允许客户端取得资讯。GET回应的资讯包含一个讯息内文,以及一些基本的标头资讯,如内文包含的资讯类型。可能的类型(就是所谓的Multipurpose Internet Mail Extensions类型,即MIME)包含text/html、image/gif、image/jpeg等等。在前面图片中显示HTML档案的要求,事实上是使用GET method建造的。</span><span  id=Layer58></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;HEAD</span><span  id=Layer59>&nbsp;</b></font>与GET回传相同的资讯,唯一的例外是它不回传讯息内文。</span><span  id=Layer60></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;POST</span><span  id=Layer61>&nbsp;</b></font>允许客户端传送资讯到Web伺服器。通常使用者输入的资讯都是透过表单(Form)传送。</span><span  id=Layer62></li><br></font></ul></font><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>HTTP定义一组method让客户端呼叫</span><span  id=Layer63></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在一个HTTP method呼叫之前,Secure Sockets Layer (SSL)交换的动作可能如</span><span  id=Layer64>&nbsp;<a href=204.htm# target=_new>第四章</span><span  id=Layer65></a>&nbsp;所描述般的发生。在这个情况下,在传送的过程中,HTTP交换的动作将会加密。将HTTP与SSL结合在一起使用有时也称为HTTPS。当浏览器存取一个典型的网页,这个网页中可能包含许多不同的元素:HTML、参考到许多不同的图型档案等等。然而网页中所有的元素并非以一个单独的HTTP要求 (HTTP request) 转送。而是发行多个GET,每一个转送网页特定的一部份。在HTTP 1.1,每个GET会额外建立一个TCP连线。现今,IIS与许多的Web伺服器所支援HTTP 1.1 可以在一个单独的TCP连线发行多个GET要求。Web伺服器本身并不会追踪所有的要求是否从同一个客户端而来的事实。对於伺服器来说,每个GET都是独立的,它并不关心要求是否来自同一个浏览器。另一种说法,互动的动作是无状态的,因为HTTP接收端实作时并不会维护客户端的状态资讯。伺服器单纯地将每个GET所要求的资讯传回,将每个要求视为完全独立、毫无相关的。HTTP原始设计的目的是希望存取包含HTML的静态档案,因此这个模型完全符合这个要求。</span><span  id=Layer66></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>HTTP视每个method的呼叫为独立的要求</span><span  id=Layer67></font></p><hr><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>若要让载入网页的动作看起来较流畅,也许是为了加快它的速度,Internet Explorer建立许多的执行绪来处理一个单一使用者的要求,然後每一条执行绪发行一个GET指令来负责处理这个网页上的一个元素。</span><span  id=Layer68></font></p><hr><p><font size=2 color=#3c3c3c face=arial>然而在动态的Web应用程式世界中,它就不具有太大的意义。若想要知道为何这个简单的解决方案会导致一些问题,假想你希望透过网际网路存取在QwickBank的银行帐户。使用浏览器,输入帐号与密码登入,接着发出一些要求:检查帐户馀额、转帐...等等。对於你来说,这些要求都视为一个单独的「session」:登入一次、处理交易,然後离去。不过HTTP协定内建并无session的概念。对於它来说,你发出的每个要求都是独立的。若为了让你只登入一次,然後在你拜访的各个网页上存取你一开始输入的资讯,如姓名,则需将session的概念移植到这一连串的无状态HTTP互动动作。为了这类的状态管理可运行,HTTP允许你使用cookie。运作的情况描述於下文。</span><span  id=Layer69></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>建立Web应用程式时通常需要追踪Session</span><span  id=Layer70></font></p><hr><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b>&nbsp;建立Session:Cookie</span><span  id=Layer71>&nbsp;</b></font>Cookie是一个简单的位元组字串,这个字串会在Web伺服器与浏览器之间来来回回间传送。预设任何东西都可以放到这个cookie中,IIS使用一个相当复杂的演算法,以目前的时间,加上一些乱数...等等来产生cookie。不过不管cookie中包含的东西为何,每个客户端的cookie都是唯一的。若IIS接收一个从不含cookie的浏览器而来的要求,便可以在记忆体中,也可能在硬碟上建立一个cookie,然後将送回浏览器。浏览器将cookie储存在记忆体,或许储存在硬碟上,然後每次对伺服器发出要求时,便将cookie送回伺服器。因为每个客户端发出的要求中都包含同样的cookie,所以这个动作能让IIS判断出这一连串的要求全部都是同一个session的一部份。</span><span  id=Layer72></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Cookie允许Web伺服器辨识同一个Session所发出的要求</span><span  id=Layer73></font></p><hr><p><font size=2 color=#3c3c3c face=arial>当IIS接收一个不含cookie的浏览器发出的要求後,IIS可以开始一个新的session。不过它如何得知一个session已结束与否呢?其中一个解决方案便是明确地通知IIS session已经结束。另一个方式便是在每一个session中设定一个计时器,若在这个时间周期内没有收到从浏览器而来的要求,便单方面地结束这个session。使用者也可能在第一次session逾期後,而且在使用者的浏览器或IIS重新启动之前再度发出要求。若这种情形发生,这些要求将会携带相同的cookie,不过IIS会为这个使用者开始一个新的session。</span><span  id=Layer74></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>若使用者发出的要求一段时间後上未能处理,Session会逾时</span><span  id=Layer75></font></p><hr><p><font size=2 color=#3c3c3c face=arial>某些Web应用程式环境,如ASP,明确的提供对session的支援。ASP程式设计师可以忽略cookie的存在,完全依赖IIS来管理session。然而其它的环境除了拥有传送cookie,接收cookie的能力之外,并没有内建对session的支援。CGI应用程式与ISAPI DLL的程式设计师若想将一连串的要求视为同一个session,就必须明确地透过cookie来达成,在此没有内建的支援。</span><span  id=Layer76></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>ASP内建支援以Cookie为基础的Session管理</span><span  id=Layer77></font></p><hr><p><font size=2 color=#3c3c3c face=arial>若一个cookie单独用来将多个HTTP要求组成一个单独的session,那麽这个cookie的值为何是无所谓的。只要这个伺服器看到的cookie相互不同,Web伺服器都能够判断哪些要求是属於哪个session的。同时当浏览器关闭时,预设会从客户端删除cookie。不过也有可能将有用的资讯储存到cookie,然後要求浏览器将cookie储存在硬碟中以备将来使用。举例来说,若一个Web应用程式要求使用者输入姓名,则姓名资料可以放到cookie中,然後送回浏览器。若应用程式设定了cookie的有效期限,则浏览器会将它写到客户端机器上的硬碟中,截至有效期限後才将之删除。下回使用者存取这个应用程式时,浏览器便传送这个cookie,则应用程式就可以用这个使用者的姓名来致欢迎词。你也可以建立索引化的cookie,内含多个值,允许将关於使用者的所有资讯储存到客户端的机器上。</span><span  id=Layer78></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Cookie能包含使用者的资讯,如他的姓名</span><span  id=Layer79></font></p><hr><a name=210002><font color=#3e70d7 face=arial size=5><b>IIS基础概论</span><span  id=Layer80></b></font><p><font size=2 color=#3c3c3c face=arial>就像其他伺服器的功能一样,IIS是设计来接受并处理HTTP的要求,然後回传结果。就先前描述,处理一个要求可能需要IIS直接读取HTML档案,然後将它的内容传回,或可能需要将要求(request)传送到某些应用程式。IIS并不是支小程式,因此在此有许多有趣的话题可供讨论。其中有两项特别切题:虚拟目录与IIS验证。</span><span  id=Layer81></font></p><font color=#3e72d7 face=arial size=4><b>虚拟目录</span><span  id=Layer82></b></font><p><font size=2 color=#3c3c3c face=arial>当一个浏览器将一个URL当成要求的一部份传送时,IIS必须使用某种方法将URL对映到这个URL指定的元素。虽然可以在URL中使用完整的档案路径名称以达成这个目的,这个结果并不吸引大部份的使用者。为了要使用简单一点的URL,IIS定义了虚拟目录的概念(也称为虚拟根目录)。一个虚拟目录不过就是档案系统中一个真正目录的别名罢了,它主要的目的就是让客户端看到的URL能够简短一些。IIS的嵌入单元,Internet Services Manager,可用来将一个特定的实体目录指定成一个虚拟目录,然後指定一个名称。一旦这个工作完成後,从浏览器传入的URL便能够包含虚拟目录的名称,IIS将会自动对应到虚拟目录的真正路径所在。IIS 5.0并非如前版将这个对照表储存在系统登录,而是储存在IIS metabase中,它是大部份IIS组态资讯的储存地方。</span><span  id=Layer83></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>虚拟目录对应到档案系统中的实际路径,可让URL的名称变短一 些</span><span  id=Layer84></font></p><hr><p><font size=2 color=#3c3c3c face=arial>举例来说,假设QwickBank选择将一群HTML档案储存在关联到www.qwickbank.com这台机器上的c:\inetpub\marketing\information目录。使用Internet Services Manager,则QwickBank的网站管理者便能够建立一个称为info的虚拟目录,然後将之关联到c:\inetpub\marketing\information。若客户端对这台机器发行一个要求,URL为http://www.qwickbank.com/info/newcust.htm,IIS将会将URL中的虚拟目录名称「info」对照到它关联的c:\inetpub\marketing\information,然後检视这个目录中的newcust.htm。</span><span  id=Layer85></font></p><font color=#3e72d7 face=arial size=4><b>IIS中的验证</span><span  id=Layer86></b></font><p><font size=2 color=#3c3c3c face=arial>就如同可透过远端存取的任何伺服器应用程式一样,IIS通常得知道它的使用者是谁。换句话说,它需拥有某些验证使用者的方式。IIS能设定以许多不同的方式来达到这个目的,并可以同时在不同的客户端上使用不同的验证机制。</span><span  id=Layer87></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>IIS支援许多验证的选项</span><span  id=Layer88></font></p><hr><p><font size=2 color=#3c3c3c face=arial>这些选项包含:</span><span  id=Layer89></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;匿名存取验证</span><span  id=Layer90>&nbsp;</b></font>(</span><span  id=Layer91><font size=2 face=arial color=#3e80d7><b>&nbsp;Anonymous authentication</span><span  id=Layer92>&nbsp;</b></font>) 并不执行验证使用者的动作。取代的方法是将每个使用者对应到Windows 2000中相同的一个使用者帐号,这个帐号被授权存取任何的HTML档案、ISAPI  DLL或ASP网页。</span><span  id=Layer93></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;基本验证</span><span  id=Layer94>&nbsp;</b></font>(</span><span  id=Layer95><font size=2 face=arial color=#3e80d7><b>&nbsp;Basic authentication</span><span  id=Layer96>&nbsp;</b></font>)  IIS要求使用者帐号输入与密码,然後在网路中进行传输。若是透过HTTP发出要求,这也就是说,若HTTP搭配SSL使用,则这个资讯将会使用标准的SSL机制进行加密,如</span><span  id=Layer97>&nbsp;<a href=204.htm# target=_new>第四章</span><span  id=Layer98></a>&nbsp;所描述。若没有搭配SSL,则传送未经加密的资讯。</span><span  id=Layer99></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;摘要式Windows网域伺服器验证</span><span  id=Layer100>&nbsp;</b></font>(</span><span  id=Layer101><font size=2 face=arial color=#3e80d7><b>&nbsp;Digest authentication</span><span  id=Layer102>&nbsp;</b></font>) 摘要式Windows网域伺服器验证和基本验证一样,依赖客户端所提供的使用者名称与密码。然而与基本验证不同的地方在於这些资讯并非以明码方式在网路上传递。取代的做法,将使用者帐号、密码与timestamp,和一些其它的资讯连结在一起。这些资讯采用MD5杂凑(hash)演算法重新产生一个新的值,然後传送到IIS。因为IIS知道客户端的密码,timestamp与任何客户端用来产生这个hash的值,它便可以计算出相同的hash值。若客户端与伺服器都使用相同的密码,则伺服器计算出来的hash值就会符合客户端传送过来的hash值,那麽验证的动作就成功了。不过,若它们使用不同的密码,则计算出来的hash值就不会相符,验证就会失败。因为密码也是hash过的部份资讯,而密码从不会使用明码的方式在网路上传送,所以客户端仍旧依赖它的密码来验证自己。这样的过程让摘要式Windows网域伺服器验证比起基本验证的方式更安全更有意义。</span><span  id=Layer103></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;整合的Windows验证</span><span  id=Layer104>&nbsp;</b></font>通常使用在内部网路(intranet),而非应用在公用的网际网路。这个选项允许IIS与浏览器进行协商,然後选择使用Kerberos或NTLM来做为验证的协定。这个解决方案只能配合Internet Explorer使用,而只有Internet Explorer 5.0以上版本支援Kerberos,而早期的版本只支援NTLM。同时注意一下,Kerberos允许委派(delegation) 能将验证要求安全地从IIS传送到其它台机器的能力。而NTLM是无法达到这个要求的。</span><span  id=Layer105></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;SSL</span><span  id=Layer106>&nbsp;</b></font>如同</span><span  id=Layer107>&nbsp;<a href=204.htm# target=_new>第四章</span><span  id=Layer108></a>&nbsp;描述,IIS依赖SChannel security service provider (SSP) 来实作SSL。回顾起SSL使用证书(certificate)与数位签章(digital signature) 验证伺服器的识别给客户端,若客户端拥有private key与证书,则SSL也可以用来验证客户端。</span><span  id=Layer109>&nbsp;<a href=204.htm# target=_new>第四章</span><span  id=Layer110></a>&nbsp;描述如何使用Microsoft Certificate Service建构CA阶层,以便发行证书给信任这个阶层的人。不过SSL最常应用在公用的网际网路,而一般的客户端并不愿意信任其它组织内部CA发行的证书 (为何该信认呢?)。这样的结果是,IIS使用来向客户端表明正身的证书通常必需从公正的CA机构取得,如VeriSign、Thawte,或其它商业性的组织。若将IIS设定为可接受客户端的证书,则透过SSL交换时,客户端传送的签名就如</span><span  id=Layer111>&nbsp;<a href=204.htm# target=_new>第四章</span><span  id=Layer112></a>&nbsp;所描述的方式进行验证。举例来说,若发行客户端证书的CA,或证书验证链(certification chain) 中的根CA在IIS伺服器所在机器上的Trusted Root CA store自行签署证书,则在这个证书验证链中的所有证书都视为有效的。为了进行签名验证,客户端的证书将会被视为信任。</span><span  id=Layer113></li><br></font></ul></font><p><font size=2 color=#3c3c3c face=arial>分散式的安全性从来就不是件容易的事。为了在不同的情况下,提供不同的需求,IIS提供许多选项。一般来说,使用最强健的验证机制是很好的也是很实际的,因为你可能想尽量提供最佳的安全性。否则,就不用烦恼了。</span><span  id=Layer114></font></p><a name=210003><font color=#3e70d7 face=arial size=5><b>了解CGI</span><span  id=Layer115></b></font><p><font size=2 color=#3c3c3c face=arial>CGI是最古老也是建立Web应用程式最广受支援的机制。不过,在IIS环境中,它并不是建立新应用程式的最佳选择。如前描述,其中一个最大的理由是,CGI为每个从客户端而来的要求开始一个新行程,速度慢是无可避免的。</span><span  id=Layer116></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CGI会针对每个要求开启一个新的行程</span><span  id=Layer117></font></p><hr><p><font size=2 color=#3c3c3c face=arial>不过,CGI相当简单易懂。当IIS接收一个从客户端而来且参考到一个CGI应用程式的要求时,便将要求中包含的资讯包装成标准格式,在另外的行程中启动这个应用程式,然後透过标准的输入与命令列,参数将这个要求的资讯传到新的行程中。因为无法制成标准格式的资讯便放在环境变数当中,所以这些资讯同样可在新的行程中存取。CGI应用程式执行所有能让要求正确地处理之动作,然後将回应的资讯写到标准的输出。IIS会读取这个回应的资讯,并建构适当的HTML回传到客户端。图10-4展示这个过程。</span><span  id=Layer118></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>IIS将客户端提供的资讯传送到一个CGI应用程式,然後将应用程式回传的资讯传回</span><span  id=Layer119></font></p><hr><p><font size=2 color=#3c3c3c face=arial>IIS支援CGI,不过Microsoft并不鼓励使用它。事实上,若说对CGI的支援主要是为了能让IIS执行早期为其它Web伺服器建立的应用程式,这是一点也不为过的。使用ISAPI或最常见的ASP来建立新应用程式应该较有意义。</span><span  id=Layer120></font></p><br><center><a target=_new href=imagesh/10-4.gif><img border=0 src='imagesl/10-4.gif'></a></center></span><span  id=Layer121><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图10-4</span><span  id=Layer122>&nbsp;</b></font>一个CGI应用程式是一个单独的行程,接受参数、执行某些动作,然後将结果传回IIS。</span><span  id=Layer123></td></table></font></center><a name=210004><font color=#3e70d7 face=arial size=5><b>了解ISAPI</span><span  id=Layer124></b></font><p><font size=2 color=#3c3c3c face=arial>比起IIS可用的其它选择,使用ISAPI建立的应用程式能够提供最佳的执行效能。因为程式设计师通常都使用非常低阶的语言,一般都使用C++,所以以ISAPI为基础的程式码能够直接存取Windows 2000提供的所有服务。对於某些问题来说,ISAPI DLL恰是正确的选择。若使用ISAPI,程式设计师可以建立扩充程式(Extension)或筛选器(Filter)。本章先讨论以上两者较常被使用的扩充程式,然後再讨论筛选器。</span><span  id=Layer125></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>ISAPI应用程式可以是一个扩充程式(Extension)或是一个筛选器(Filter)</span><span  id=Layer126></font></p><hr><p><font size=2 color=#3c3c3c face=arial>扩充程式(Extension)典型的用法展示於图10-5。浏览器传送一个HTTP要求到IIS,如GET,指明一个指向ISAPI扩充程式的URL。若ISAPI扩充程式尚未载入,IIS便找寻这个DLL并将之载入到记忆体。然後将伴随要求而来的参数传递到扩充程式,最後再取得答覆。传送到浏览器的结果将显示给使用者。</span><span  id=Layer127></font></p><br><center><a target=_new href=imagesh/10-5.gif><img border=0 src='imagesl/10-5.gif'></a></center></span><span  id=Layer128><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图10-5</span><span  id=Layer129>&nbsp;</b></font>一个ISAPI DLL扩充程式可在第一个要求到达时载入,然後保留在记忆体以处理未来的要求。</span><span  id=Layer130></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>ISAPI扩充程式可以载入IIS的行程中,或载入另外的行程,全看如何进行设定而决定。照例,速度与可靠性之间是两难的,将ISAPI DLL载入记忆体能够快速地存取,但DLL中的臭虫可让整个Web伺服器当掉。然而一旦载入之後,不管是载入IIS的行程或是分开的行程,ISAPI扩充程式预设会保持载入的状态,直到执行它的行程关闭为止。</span><span  id=Layer131></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>扩充程式处理从客户端而来的特定要求</span><span  id=Layer132></font></p><hr><p><font size=2 color=#3c3c3c face=arial>对於从客户端接收到的所有要求来说,IIS建立一个称做扩充程式控制区块(extension control block)的资料结构。然後将从HTTP要求接收到的资讯填入这个资料结构。这个资讯包含了客户端指定的HTTP method (如GET或POST),出现在要求上的查询字串(Query String,也就是浏览器传送的URL末端「?」号之後的资讯)...等等。一旦完成这个动作,当呼叫到扩充程式提供的最重要的函数HttpExtensionProc时,IIS便将这个资料结构当做是一个唯一的参数,传送到IIS 扩充程式。</span><span  id=Layer133></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>IIS传送客户端提供的资讯到一个扩充程式,然後将扩充程式回传的资讯传送到客户端</span><span  id=Layer134></font></p><hr><p><font size=2 color=#3c3c3c face=arial>扩充程式(Extension)中的程式码检查收到的延伸程式控制区块,然後执行任何它希望的行动。扩充程式可以做所有的事以便满足这个客户端的要求,包含存取一个或多个资料库,建立或使用COM物件等等。若要将回应传送到客户端,ISAPI扩充程式便呼叫IIS提供的一个回呼(callback)函数,WriteClient。不管扩充程式传送的资讯为何,透过这个函数回传到客户端的资讯都是采用HTTP的协定。</span><span  id=Layer135></font></p><p><font size=2 color=#3c3c3c face=arial>筛选器(Filter)很类似扩充程式,不过也有许多不同点。ISAPI筛选器与扩充程式的相同点在於ISAPI筛选器是一个DLL,载入IIS的行程中执行。而不同点在於筛选器载入的时间点是Web伺服器启动时,保留在记忆体,直到行程关闭为止。当一个筛选器载入时,它会将能接受的事件清单传送给IIS,包含授权给使用者的事件、传送一个回应给使用者、撰写一笔日志记录...等等。任何筛选器注册感兴趣的事件发生後,IIS呼叫筛选器中的HttpFilterProc函数,传递事件的相关资讯,筛选器便可以参与事件的处理。举例来说,筛选器可以执行特殊的验证动作,或资料加密,或者可以在IIS传送的每一个网页加上表尾。但过度使用ISAPI筛选器会降低执行效能,这是因为它会干扰许多要求,不过对於某些问题而言,它们是相当吸引人的解决方案。</span><span  id=Layer136></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>每当注册的事件触发时,便自动呼叫筛选器(filter)</span><span  id=Layer137></font></p><hr><p><font size=2 color=#3c3c3c face=arial>与CGI或ASP做个比较,撰写一个ISAPI扩充程式是一个困难重重的工作。首先,使用C++就比使用VBScript撰写ASP网页还具备更大的挑战。同样的,ISAPI提供的服务较少,如先前所提及的,没有内建对session的支援。再者,一个ISAPI 扩充程式必须同时处理多条执行绪,因为IIS自己就包含了多条执行绪,因此再次呼叫HttpExtensionProc函数之前,它不会等待呼叫到HttpExtensionProc的函数回传便可以继续处理其它使用者发出来的要求。一般而言,可以这麽说,IIS应用程式的帝国可以使用ASP建立,而ISAPI保留给真正要求高效能的案例使用。</span><span  id=Layer138></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>撰写ISAPI扩充程式与筛选器可能相当困难</span><span  id=Layer139></font></p><hr><a name=210005><font color=#3e70d7 face=arial size=5><b>了解ASP</span><span  id=Layer140></b></font><p><font size=2 color=#3c3c3c face=arial>ASP网页的基本概念并不难理解。如</span><span  id=Layer141>&nbsp;<a href="#10-3" target=_new>图10-3</span><span  id=Layer142></a>&nbsp;所示,一个包含HTML的档案中也可以包含可执行的程式码,通常使用JavaScript或VBScript语言撰写。在前面的例子中,这个程式码将会传送到客户端,然後在浏览器上执行。ASP网页的概念很简单,包含内嵌在HTML档案中的script程式码。然而使用ASP,包含在档案中的程式码是在伺服器上执行,而非在客户端机器上执行的。执行的结果以及包含在档案中的HTML或其它资讯将会传送到客户端,由浏览器负责显示。这个运作的过程如图10-6所示。</span><span  id=Layer143></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个ASP网页包含了执行在伺服器上的Script程式码</span><span  id=Layer144></font></p><hr><p><font size=2 color=#3c3c3c face=arial>就这个例子的启发,ASP的功能可分为两个不同的部份。其一是真正读取并解译网页上script程式码的scripting引擎,其二为一个标准的ISAPI 扩充程式,称为asp.dll,它真正实作了核心的ASP函数。欲载入哪一个scripting引擎视网页包含的开发语言而定。图10-6中的script使用预设的ASP语言、VBScript,因此载入的便是VBScript scripting引擎。本章其馀的部份并不会将scripting引擎显示在图表中,不过它是永远存在的。</span><span  id=Layer145></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个ASP网页上的程式码是由Scripting引擎解译的</span><span  id=Layer146></font></p><hr><br><center><a target=_new href=imagesh/10-6.gif><img border=0 src='imagesl/10-6.gif'></a></center></span><span  id=Layer147><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图10-6</span><span  id=Layer148>&nbsp;</b></font>一个参考到ASP网页的要求,将导致IIS执行这个档案中的script,然後将结果传送到客户端。</span><span  id=Layer149></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>值得一提的是图10-6的ASP网页范例是个过於不切实际的简单范例。事实上这个范例输出的结果与前一张图的范例一样。在实际的应用程式中,没有人会建立这麽简单的网页。然而在此的目的是尽量让ASP运作的基本机制更为清楚,因此才会有这样简单的script范例出现。</span><span  id=Layer150></font></p><p><font size=2 color=#3c3c3c face=arial>ASP档案中可以包含HTML标注、一般的文字、或某些语言的script叙述句。有被虐狂的人可以选择一般的文字编辑器来建立一个ASP网页,如使用记事本(Windows Notepad)。不想在痛苦中生存的人可以使用内建支援ASP script撰写能力的工具,如Microsoft Visual InterDev。不管如何完成这个网页,伺服器机器都需具备用来撰写script叙述的语言之script引擎。Windows 2000包含VBScript与Microsoft Jscript (Microsoft实作的JavaScript) 的script引擎,以及其它第叁协力厂商开发的语言之script引擎。虽然ASP是语言中立的,但VBScript却是ASP开发者最不常用的选择。</span><span  id=Layer151></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>大部份的ASP开发者通常使用VBScript</span><span  id=Layer152></font></p><hr><p><font size=2 color=#3c3c3c face=arial>虽然它们是很简单的语言,VBScript与JScript允许ASP开发者以类似的方式撰写程式:使用变数、条件式判断、回圈以及副程式。本章并未尝试教授任一种语言,不过放心,撰写ASP网页和撰写其它类型的程式没有什麽不同。不管使用何种语言撰写script,script不过是包装在HTML中的程式码,储存在某些档案中。因此当HTML中包含程式码时,也就是说包含ASP script,就必须要有某种方法告诉IIS该执行这些程式码。为了达到这个目的,伺服器机器上包含ASP Script的任何档案其名称都需以 .asp结束。一开始若副档名为 .asp的档案中只包含HTML档案,这是个很差的主意(也就是说没有包含任何伺服端的script程式码),因为处理这种档案所花费的时间比副档名为 .htm的还要长很多。然而在Windows 2000中,这个事实再也不能成立了。因此 .asp档案可用在不含ASP script的程式码档案中。</span><span  id=Layer153></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>包含ASP网页的档案名称,都拥有 .ASP的副档名</span><span  id=Layer154></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在ASP网页的HTML中,伺服端scripting指令通常都是以「&lt;%」与「%>」符号包围起来。这些指令必须存在於所谓的主要scripting语言,预设为VBScript。也有可能将script程式码以&lt;SCRIPT>与&lt;/SCRIPT>标注包围起来。若你要在预设使用VBScript的ASP网页中包含一段JScript,举例来说,你可以以&lt;SCRIPT LANGUAGE=JScript RUNAT=SERVER>与&lt;/SCRIPT>标注将程式码包围起来。因为&lt;SCRIPT>标注也可以用来包装客户端的script,因此在这个情况下还需使用RUNAT关键字,以便允许IIS辨识传送到客户端浏览器并执行的script为哪一种。</span><span  id=Layer155></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>执行在伺服器上的程式码必需使用特殊的符号包围起来</span><span  id=Layer156></font></p><hr><p><font size=2 color=#3c3c3c face=arial>不管使用的script为何,一个ASP网页中也可以包含和语言无关 (language-independent)的指令。其中一种指令称为处理指令,格式为&lt;%@keyword=value %>。端赖写在关键字 (keyword) 部份的指令,每一个指令指示ASP解译器完成一个特定的工作。而&lt;%@ LANGUAGE=JScript %>可用来设定网页预设的script语言为JScript。举例来说,TRANSACTION关键字可设定网页的交易性需求。(ASP如何使用交易的动作将在本章稍後部份详述)。</span><span  id=Layer157></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>ASP网页可以包含指令</span><span  id=Layer158></font></p><hr><font color=#3e72d7 face=arial size=4><b>ASP应用程式</span><span  id=Layer159></b></font><p><font size=2 color=#3c3c3c face=arial>一个ASP应用程式是由一群ASP档案组成,储存在档案系统一个单独的目录中。网站管理员或应用程式设计者可以使用 IIS嵌入式管理单元指定一个目录做为一个应用程式的根目录,而所有的 .asp档案便储存在这个目录中,而此目录之下的子目录都视为这个ASP应用程式的一部份。这个目录可能(或不可能)会被指定一个虚拟目录名称,任一种选择都是可被允许的。</span><span  id=Layer160></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一组ASP网页可以组态为一个ASP应用程式</span><span  id=Layer161></font></p><hr><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>不要将一个ASP应用程式与一个COM+应用程式搞混了,它们是不同的概念。</span><span  id=Layer162></font></p><hr><p><font size=2 color=#3c3c3c face=arial>举例来说,假设QwickBank提出一个退休计算服务,让Web客户估计需储备多少退休金才能避免一辈子都在工作,另一个方案是提供一个方法让顾客管理他们的银行帐户。假设上面两种服务都透过ASP网页来提供。图10-7显示这些档案在硬碟中储存的位置。实作的退休计算服务的rc1.asp与rc2.asp 这两个ASP网页储存在retirecalc目录之下,同时设定成一个单独的ASP应用程式。am1.asp、am2.asp、am3.asp这叁个ASP网页实作了帐户管理的应用程式,储存在acctmgmt子目录中,同时也设定成第二个应用程式。</span><span  id=Layer163></font></p><br><center><a target=_new href=imagesh/10-7.gif><img border=0 src='imagesl/10-7.gif'></a></center></span><span  id=Layer164><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图10-7</span><span  id=Layer165>&nbsp;</b></font>组成一个特殊ASP应用程式的许多ASP网页都是储存在伺服器机器的档案系统中特定的目录之下。</span><span  id=Layer166></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>若ASP应用程式的根目录没有包含任何的子目录(如图10-7中两个应用程式的情况所示),而根目录只包含图中的档案。不过若根目录中包含子目录,则这个ASP应用程式同样也包含所有子目录中的全部档案。不过有一个例外情况:若根目录中的某个子目录也被设定成一个ASP应用程式的根目录,则此目录其下的档案自然形成一个应用程式,再也不属於此目录阶层中上层目录的一部份。</span><span  id=Layer167></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>特定ASP应用程式下的所有档案都必需存在於一个公用根目录之下</span><span  id=Layer168></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在一个单独应用程式(更精确的说,是指用来解译这些网页的scripting引擎)中的ASP网页与网页中使用的任何COM元件都会以不同的方式载入行程中执行。其中一种可能是,它们全部会执行在IIS的行程中,这也就是说在Web伺服器自己的行程中执行。这样将可达到最佳的执行效能,不过也是个相当冒险的方法,元件中的某些臭虫可能会使Web伺服器当机。另一种选择便是将ASP应用程式执行在另一个行程,或乾脆将ASP网页与COM元件分开,在不同的行程中执行它们。这是一种安全的作法,因为应用程式中的错误并不会影响到Web伺服器本身。同样它执行时很慢,因为客户端发出的每个要求都必需从主要的IIS行程传递到另一个行程,再回传之。程式设计师可依照应用程式的执行效能与可靠性需求选择任一种方式。</span><span  id=Layer169></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>ASP网页与COM元件可以以很多不同的方式分组成多个行程</span><span  id=Layer170></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在图10-7中,c:\inetpub\applications\acctmgmt目录中包含一个档案,名称为global.asa。任何ASP应用程式的根目录中都可以拥有一个这样名称的档案。(虽然这不是必须的,注意图10-7的其它ASP应用程式中并没有包含global.asa档案。)如果这个档案目前包含script程式码,当不同的事件发生时便执行这些程式。举例来说,有时当一个ASP应用程式初次执行,或关闭时可用来执行一些动作。(定义上,一个ASP应用程式开始於任一个客户端存取到此应用程式的任一个网页,而结束於IIS本身关闭时。) 举例来说,当应用程式启动,建立一个共享的COM物件,或是在应用程式结束时,删除一个暂存的目录可能是很有用的。为了达到这个目的,应用程式中的globas.asa档案内就可以包含script,当应用程式的OnStart事件与OnEnd触发时便执行这些script。就名称所暗示,这些事件发生在ASP应用程式开始与结束,因此关联到它们的script叙述只会在应用程式的生命周期中分别执行一次。</span><span  id=Layer171></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个Glogal.asa档案可以包含在一个应用程式初始化与结束时的程式码</span><span  id=Layer172></font></p><hr><p><font size=2 color=#3c3c3c face=arial>对於某些应用程式来说,在每个session的开始与(或者)结束执行一些标准的script也是很有帮助的。为了达到这个目的,应用程式的global.asa档案也可以包含在两个事件发生时执行的script,即Session OnStart与Session OnEnd事件。Session OnStart事件发生在一个新session开始时,而关联到这个事件的script (如果有的话),便在使用者所要求的网页执行之前先执行。ASP应用程式中Session的结束点将在本节稍後部份讨论。不过不管何时触发Session OnEnd事件,时机到了总是会发生的。关联到Session OnEnd事件的script便根据session的结果撰写一笔记录到日志中,或是执行一些清除的善後工作。</span><span  id=Layer173></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个Glogal asa档案可以包含可以一个Session初始化与结束时的程式码</span><span  id=Layer174></font></p><hr><font color=#3e72d7 face=arial size=4><b>ASP内建的物件</span><span  id=Layer175></b></font><p><font size=2 color=#3c3c3c face=arial>ASP扩充程式内建就实作了许多不同的COM类别。每个类别提供一组特殊的method与属性,从每个类别衍生的物件便可以让ASP网页使用。ASP网页中的程式码使用类别之前并不需要先建立类别的实例(instance)。而是在需要时由ASP扩充程式自动地建立这些物件。如图10-8所示,ASP网页可以使用的物件包含:Request、Response、Server、Application、Session、ASPError,与ObjectContext (如图所示,它是由COM执行时期程式库所提供的。)每个物件的使用方法将描述於下文。</span><span  id=Layer176></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>ASP网页也可以其它方式建立COM物件</span><span  id=Layer177></font></p><hr><br><center><a target=_new href=imagesh/10-8.gif><img border=0 src='imagesl/10-8.gif'></a></center></span><span  id=Layer178><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图10-8</span><span  id=Layer179>&nbsp;</b></font>ASP扩充程式提供许多内建的物件让ASP网页使用。</span><span  id=Layer180></td></table></font></center><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b>&nbsp;Request</span><span  id=Layer181>&nbsp;</b></font>回顾一下ASP网页回应客户端的要求而执行,使用者通常是透过浏览器来发出这项要求。一旦ASP网页执行了,便可以使用Request物件学习与客户端相关的资讯,并得知透过客户端的要求所传送的资讯。常见的情况是,IIS传送一个包含一个或多个FORM标注的HTML网页到浏览器。通常FORM标注用来让使用者输入欲传送到伺服器的资讯,如名称、欲搜寻的字串,或信用卡号码。一个包含一个或多FORM标注的网页,也可能包含用来验证使用者输入的资讯之客户端script。这些script可能用来验证电话号码栏位中只能包含数字,或密码设定时最少要达到指定的长度。</span><span  id=Layer182></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Request物件能让ASP网页得知客户端的要求</span><span  id=Layer183></font></p><hr><p><font size=2 color=#3c3c3c face=arial>不管客户端script是否用来进行验证的动作,每个FORM标注都可以包含一个ACTION属性指明当使用者提交这个表单时,该执行的网页名称。其中一种可能便是让这个属性参考到一个ASP网页,因此当使用者提交这个表单时,适当的ASP网页便会执行。若将表单传送到IIS时使用HTTP GET method,则使用者输入在表单的资讯就会跟随在URL之後,并以「?」号分开。一旦ASP网页开始执行,网页中的script程式码便可以存取Request物件,这个物件中将会包含表单的资讯、随要求而来的cookie(若存在的话),等等。</span><span  id=Layer184></font></p><p><font size=2 color=#3c3c3c face=arial>透过Request物件可取得的资讯包含:</span><span  id=Layer185></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Query String</span><span  id=Layer186>&nbsp;</b></font>出现在浏览器传送过来的URL「?」号之後的文字。就如先前所描述的一样,使用者使用FORM标注输入的资讯将会出现在此。</span><span  id=Layer187></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Client certificate</span><span  id=Layer188>&nbsp;</b></font>若存在的话。虽然让客户端传送certificate是目前很平常的作法,不过这也会随时间而转变,由其是smart card变得愈来愈受欢迎了。然而,若传送了client certificate,ASP网页便可以存取Request物件来取得certificate更详细的内容,以便能更聪明地决定授权的动作。</span><span  id=Layer189></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Cookie</span><span  id=Layer190>&nbsp;</b></font>包含随着要求而来的cookie之内含值。ASP扩充程式自动提供session管理,因此ASP开发者并不需要自行操作cookie</span><span  id=Layer191></li><br></font><br><font size=2 color=#3c3c3c  face=arial>以达到管理的目的。若cookie包含应用程式专属的资讯,如使用者的名称,则ASP网页可能会进行内容的检查。</span><span  id=Layer192></font><font size=2 face=arial color=#3c3c3c><li>各种环境变数,IIS与ASP扩充程式在每个要求发生时会自动设定环境变数。这些资讯包含取回的MIME类型资讯,描述发出要求的浏览器资讯、这个要求是否使用SSL、发出要求的客户端IP位址...等等。</span><span  id=Layer193></li><br></font></ul></font><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b>&nbsp;Response</span><span  id=Layer194>&nbsp;</b></font>Response物件允许ASP网页控制欲回传的浏览器的资讯。除ASP档案中的伺服端script之外的所有东西,如HTML标注、客户端script,与一般的文字等都不会经过任何转换直接传送到浏览器。若你希望在ASP网页中新增一些东西到欲显示的HTML (这是ASP存在的理由),你便可以使用Response物件。这个物件提供的method包含:</span><span  id=Layer195></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Write</span><span  id=Layer196>&nbsp;</b></font>允许script将字串,或变数的值新增成一个资讯的串流,然後再传送回浏览器。图10-6展示的这个简单的script便使用此method将两个HTML标注与「Hello」这个字传送给使用者。</span><span  id=Layer197></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Redirect</span><span  id=Layer198>&nbsp;</b></font>自动将客户端引导到其它的网页。这个method一般都应用在目标的网页存在於其它机器上时。然而,若客户端欲导向的网页存在同一台机器上,则这个方式将会比使用Server物件的Transfer method更有效率。稍後再讨论。</span><span  id=Layer199></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Flush</span><span  id=Layer200>&nbsp;</b></font>马上将缓冲区欲输出的资料传送出去。若开启缓冲功能,则在任何的结果传送至客户端之前,会先进行整个ASP网页的处理过程,这些结果会放在缓冲区,直到处理的过程结束为止。若关闭缓冲功能,则一产生结果便传送出去,不等待整个网页处理结束。IIS 5.0预设将缓冲的功能开启,与先前的版本不同。</span><span  id=Layer201></li><br></font></ul></font><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Response物件允许一个ASP网页传送一个回应到客户端</span><span  id=Layer202></font></p><hr><p><font size=2 color=#3c3c3c face=arial>Response物件同样显露许多的属性。在这些属性指定的值会影响到传送至使用者的内容。这些属性包含:</span><span  id=Layer203></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;ContentType</span><span  id=Layer204>&nbsp;</b></font>允许设定传送MIME类型的资讯。</span><span  id=Layer205></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Buffer</span><span  id=Layer206>&nbsp;</b></font>允许开启或关闭缓冲的功能。</span><span  id=Layer207></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;CacheControl</span><span  id=Layer208>&nbsp;</b></font>控制ASP网页的内容是否可以暂存在proxy server。Proxy server介於Web伺服器与浏览器之间,可能会将经常存取的网页储存起来。因为这个复本可以快取在proxy server上,然後满足未来浏览器发出的要求无庸再次打扰Web伺服器,如此将可大幅加快存取静态网页的速度。但是对於动态即时网页(如典型的ASP)而言,将网页放入快取与重复使用这个复本将会造成问题。预设并不允许快取的机制,不过可透过这个属性更改。</span><span  id=Layer209></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b>&nbsp;Expires</span><span  id=Layer210>&nbsp;</b></font>假设ASP网页产生的结果可以储存的话,此属性可用来控制ASP网页放在浏览器快取中时间的长短。</span><span  id=Layer211></li><br></font></ul></font><p><font size=2 color=#3c3c3c face=arial>Response物件同样包含一个资讯的集合,称cookie。若使用cookie,则ASP应用程式便可以设定特定的cookie值,然後回传到客户端,再设定这些cookie的有效期限。</span><span  id=Layer212></font></p><p><font size=2 color=#3c3c3c face=arial>因为呼叫Response.Write的动作常发生,因此便有了缩写。不必明确呼叫write,ASP网页中可以包含此型式的指令&lt;%= expression %>,它们代表的意义是相同的。举例来说,下面的范例:</span><span  id=Layer213></font></p><div style="background-color: #D7D7D7;"><font face=Arial size=3><pre>&lt;%="Hello " %></span><span  id=Layer214></pre></font></div><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>ASP提供了Response.Write的缩写</span><span  id=Layer215></font></p><hr><p><font size=2 color=#3c3c3c face=arial>是一个ASP网页,它与下面的叙述具有相同的效果:</span><span  id=Layer216></font></p><div style="background-color: #D7D7D7;"><font face=Arial size=3><pre>&lt;%response.write "Hello" %></span><span  id=Layer217></pre></font></div><p><font size=2 color=#3c3c3c face=arial>这两行程式都将「Hello」字串新增到一个位元组串流,然後传送回浏览器。</span><span  id=Layer218></font></p><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b>&nbsp;Server</span><span  id=Layer219>&nbsp;</b></font>目前为止关系到Server内建物件最重要的事便是它允许使用自己的CreateObject method来建立server-side COM物件。举例来说,若要建立一个ProgID为QwickBank.FinCalc 的COM类别实例,则ASP script的程式码可以包含这一行:</span><span  id=Layer220></font></p><div style="background-color: #D7D7D7;"><font face=Arial size=3><pre>&lt;%Obj =Server.CreateObject("QwickBank.FinCalc")%></span><span  id=Layer221></pre></font></div><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Server物件能让一个ASP网页建立COM物件</span><span  id=Layer222></font></p><hr><p><font size=2 color=#3c3c3c face=arial>也有其它的方式可以让ASP网页建立COM物件。举例来说,script中可以包含HTML的&lt;OBJECT>标注,指定RUNAT=SERVER属性。也可以使用scripting语言本身提供的函数从ASP网页来建立COM物件:如VBScript中的CreateObject,JScript中的NEW。不过,通常来说这并不是个好主意。ASP 扩充程式并不会牵涉到物件建立的过程,因此它不能以此方式对物件进行有效的管理。</span><span  id=Layer223></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>ASP网页也可以其它方式建立COM物件</span><span  id=Layer224></font></p><hr><p><font size=2 color=#3c3c3c face=arial>不管它们是怎样建立的,从VBScript或JScript,或典型的ASP语言存取的COM物件都必须使用dual interface来显露它们的method。ASP script无法使用只能透过vtable存取其method的物件。这个限制也是为何大部份开发专案不建立只使用vtable介面的物件之其中一个原因  从ASP网页存取COM元件是很常见的需求,不得不允许之。</span><span  id=Layer225></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>能让ASP网页存取的COM物件必需是Dual Interface</span><span  id=Layer226></font></p><hr><p><font size=2 color=#3c3c3c face=arial>预设使用Server.CreateObject建立的物件其存活的生命周期只在建立此物件的ASP网页执行时。(这也是使用&lt;OBJECT>标注建立物件的预设状态) 在同一个ASP档案中的任何script叙述都可以使用这个物件,但其它的.asp档案无法存取这个特殊的实例。这类物件的生命周期为一个网页,代表当网页执行完毕时,ASP 扩充程式便呼叫物件上的Release,让物件自我摧毁。你也可以给予物件application或session范围的生命周期。本章稍後再讨论如何完成这个动作。</span><span  id=Layer227></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>ASP网页建立的COM物件预设的生命周期范围为网页(page scope)</span><span  id=Layer228></font></p><hr><p><font size=2 color=#3c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -