Chinaopub coM 第4章服务器进程和 ASP Serve对象 前面的章节已经研究了ASP的一些内置对象。重点介绍的对象有 Request、 Response、 Session和 Application对象。ASP中另一个比较主要的对象为 Server对象。本章重点介绍这个对 象的背景知识和使用方法。 Server对象在服务器端脚本中通过实例和使用其他外部对象和组件,提供了一种扩展ASP 页的功能的方法。事实上,许多人认为这个对象是ASP之所以能够流行的主要因素。引入 Server对象的意义很大,这意味着ASP不必提供人们所需要的所有属性。它可调用其他应用程 序和组件完成指定工作。 这也恰好符合了构建由独立的对象组成的应用程序的总体目标,而不是构建通常见到的 那种耗尽硬盘空间的“可做每件事情”的巨型程序。不仅仅是在计算机的世界中,整个世界 正在朝着组件和“即插即用”概念方面发展。如今,当汽车或电视机发生故障时,技师或工 程师很可能会拔出有问题的部件并且插上一个新的部件,因此,汽车维护人员或电视机维修 人员的工作也变成了面向对象的。 然而,IS同样支持使用外部对象和与服务器环境进行交互作用的许多传统方法。这是 个特定的例外,这些方法并不是真正的ASP组成部分,但通常的确非常有用,并且通过 Server 对象的一些新特性已经与ASP很好地进行了集成。本章将简要地回顾这些传统方法,然后详 细地介绍 ASP Server对象 本章的主要内容为 传统的服务器端包含(SSI)指令的背景知识和使用方法。 Server对象所要完成的任务,以及与SSI的比较。 如何使用 Server对象实例、外部组件和应用程序, 如何使用 Server对象执行封装的脚本或其他ASP页面。 ·如何使用 Server对象管理在脚本中出现的错误 如何使用Server对象完成与HTML或HTTP兼容的格式转换 Server对象是ASP页中的错误处理过程的一部分,这在IS5.0和ASP3.0中是新的内容。本 章介绍该对象是如何工作的。因为有单独的一章(第7章)专门讨论有关调试和错误处理方面的 所有问题,所以本章只简要地讨论错误处理方法,并且仅限于 Server对象直接涉及的过程。 4.1动态页中服务器端的处理 就服务器端处理而言,ASP是产生动态Web网页的一种相对较新的技术。动态页意味着什 么呢?先暂时不考虑客户端相关功能上的进展,也不讨论客户端脚本、 Java Applet、动态 HTML或 Activex控件等内容。这里的动态页是专指服务器响应客户端请求而产生的页面,并 且根据情况每次产生的页面可能是不同的。 举个简单的例子,创建一个只包含当前日期和时间的页面。每次请求该页面时将显示 个不同的值,因为日期和时间取决于服务器的时钟,或取决于提供日期和时间的一个资源(例
下载 第4章 服务器进程和ASP Server对象 前面的章节已经研究了 A S P的一些内置对象。重点介绍的对象有 R e q u e s t、R e s p o n s e、 S e s s i o n和A p p l i c a t i o n对象。A S P中另一个比较主要的对象为 S e r v e r对象。本章重点介绍这个对 象的背景知识和使用方法。 S e r v e r对象在服务器端脚本中通过实例和使用其他外部对象和组件,提供了一种扩展 A S P 页的功能的方法。事实上,许多人认为这个对象是 A S P之所以能够流行的主要因素。引入 S e r v e r对象的意义很大,这意味着 A S P不必提供人们所需要的所有属性。它可调用其他应用程 序和组件完成指定工作。 这也恰好符合了构建由独立的对象组成的应用程序的总体目标,而不是构建通常见到的 那种耗尽硬盘空间的“可做每件事情”的巨型程序。不仅仅是在计算机的世界中,整个世界 正在朝着组件和“即插即用”概念方面发展。如今,当汽车或电视机发生故障时,技师或工 程师很可能会拔出有问题的部件并且插上一个新的部件,因此,汽车维护人员或电视机维修 人员的工作也变成了面向对象的。 然而,I I S同样支持使用外部对象和与服务器环境进行交互作用的许多传统方法。这是一 个特定的例外,这些方法并不是真正的 A S P组成部分,但通常的确非常有用,并且通过 S e r v e r 对象的一些新特性已经与 A S P很好地进行了集成。本章将简要地回顾这些传统方法,然后详 细地介绍ASP Server对象。 本章的主要内容为: • 传统的服务器端包含( S S I )指令的背景知识和使用方法。 • Server对象所要完成的任务,以及与 S S I的比较。 • 如何使用S e r v e r对象实例、外部组件和应用程序。 • 如何使用S e r v e r对象执行封装的脚本或其他 A S P页面。 • 如何使用S e r v e r对象管理在脚本中出现的错误。 • 如何使用S e r v e r对象完成与H T M L或H T T P兼容的格式转换。 S e r v e r对象是A S P页中的错误处理过程的一部分,这在 IIS 5.0和ASP 3.0中是新的内容。本 章介绍该对象是如何工作的。因为有单独的一章 (第7章)专门讨论有关调试和错误处理方面的 所有问题,所以本章只简要地讨论错误处理方法,并且仅限于 S e r v e r对象直接涉及的过程。 4.1 动态页中服务器端的处理 就服务器端处理而言,A S P是产生动态We b网页的一种相对较新的技术。动态页意味着什 么呢?先暂时不考虑客户端相关功能上的进展,也不讨论客户端脚本、 Java Applet、动态 H T M L或A c t i v e X控件等内容。这里的动态页是专指服务器响应客户端请求而产生的页面,并 且根据情况每次产生的页面可能是不同的。 举个简单的例子,创建一个只包含当前日期和时间的页面。每次请求该页面时将显示一 个不同的值,因为日期和时间取决于服务器的时钟,或取决于提供日期和时间的一个资源 (例
CaiNapub.comM8BsebEAspSanerig99 下载 如一个独立的服务器或来自于互联网上一个标准时钟)。当然,实际上动态页要比这复杂得多, 也许显示数据库记录的当前值或者邮件服务器上等待着的邮件消息的摘要。重要的是服务器 不仅阅读一个无格式的HTML页面、或磁盘上的文本文件以及把它们发送给客户,而且,必 须完成一些工作来创建该页面 Internet服务器应用编程接口 第1章介绍了创建动态页的一些方法。传统的技术是使用与Web服务器的一个接口,它被 称为 IInternet服务器应用编程接囗( Internet Server Application Programming Interface, ISAPI) SAPI可用于执行其他的应用程序,这些应用程序通过C语言风格的 stdin和 stdout数据流函 数来读取客户端请求的值并创建Web服务器的响应。 ISAPI应用程序所必须做的全部事情就是 编写相应结果页面的文本和HTML,并通过 stdout函数输出到Web服务器。事实上 ASP DLL内 部真正做的事情是更面向对象的。 IS自开始就支持 ISAPI的应用程序和脚本解释器。它提供一个特殊的解释器动态链接库 给出访问服务器的请求和响应的另一种方法,尽管受到一定的限制。它通过服务器端包含指 令实现,之所以这样说,是因为它们是在服务器上执行的,并且结果包含在传送给客户端的 响应中。这个特性在IS中是通过一个名为 sinc,d的动态链接库实现的。缺省情况下,IS把 文件扩展名为. shtml、shtm或stm的任意页面都映射到这个动态链接库。打开默认Web站点的 Properties对话框,在 Application Setting中单击 Configuration按钮,可以看到这种映射,如图 4-1所示。 pp Mapping: App Options App Debugging F Cache ISAP applcations Applcaton Mappings Extention Executable Path ANNT \System32\ d \System32\netsrM\ d GET HEA CWINNT\System32\net:rM\asp dl GET HEAD C\INNT \Syatem\netty \asp. d GET HEAD 32\nets asp d GET HEAD NNT 图41 Application Configuration对话框 这样,带有这些被映射的文件扩展名的页面将被传送给 sinc.d进行处理。因此,执行页
如一个独立的服务器或来自于互联网上一个标准时钟 )。当然,实际上动态页要比这复杂得多, 也许显示数据库记录的当前值或者邮件服务器上等待着的邮件消息的摘要。重要的是服务器 不仅阅读一个无格式的 H T M L页面、或磁盘上的文本文件以及把它们发送给客户,而且,必 须完成一些工作来创建该页面。 I n t e r n e t服务器应用编程接口 第1章介绍了创建动态页的一些方法。传统的技术是使用与 We b服务器的一个接口,它被 称为I n t e r n e t服务器应用编程接口(Internet Server Application Programming Interface,I S A P I )。 I S A P I可用于执行其他的应用程序,这些应用程序通过 C语言风格的s t d i n和s t d o u t数据流函 数来读取客户端请求的值并创建 We b服务器的响应。I S A P I应用程序所必须做的全部事情就是 编写相应结果页面的文本和 H T M L,并通过s t d o u t函数输出到We b服务器。事实上ASP DLL内 部真正做的事情是更面向对象的。 I I S自开始就支持I S A P I的应用程序和脚本解释器。它提供一个特殊的解释器动态链接库, 给出访问服务器的请求和响应的另一种方法,尽管受到一定的限制。它通过服务器端包含指 令实现,之所以这样说,是因为它们是在服务器上执行的,并且结果包含在传送给客户端的 响应中。这个特性在 I I S中是通过一个名为 s s i n c . d l l的动态链接库实现的。缺省情况下, I I S把 文件扩展名为. s h t m l、. s h t m或. s t m的任意页面都映射到这个动态链接库。打开默认 We b站点的 P r o p e r t i e s对话框,在Application Setting中单击C o n f i g u r a t i o n按钮,可以看到这种映射,如图 4 - 1所示。 图4-1 Application Configuration对话框 这样,带有这些被映射的文件扩展名的页面将被传送给 s s i n c . d l l进行处理。因此,执行页 第 4章 服务器进程和A S P S e rv e r对象计计99 下载
10045p3高要编程 Chinapub.com 下载 面中所有的服务器端包含语句,结果(如有的话)插入到服务器的响应中,即插入到客户端接收 到的页面中。 因为这些文件是映射到snc.d文件而不是映射到ASP动态链接库(aspd)的,所 以在这些页面中的所有ASP代码将被忽略并且按照原有状态传送给客户端,客户端将 能够看到这些脚本。然而,在ASP3.0版本中有一个避免这种情况的方法,稍后在讨 论 Server对象的 Execute和 Transfer方法时,研究这个方法 4.2服务器端的包含指令 利用服务器端的包含(SSI)语句(或者指令)能够做些什么呢?实际上不多,除非打算创建 在web服务器上运行的可执行文件,并通过 stdin和 stdout函数访问 ISAPI。这就意味能够用C、 C艹或其他语言(如 Delphi)等编写它们,但ⅤB并不适合。此外,使用SSI指令能够做的事情可 达到与在ASP中实现同样好的效果。许多方法中,IS的SSI特性对使用这些特性的原有的web 网站和Web页面具有向下兼容性 然而,可能有时会希望在站点上使用SSI而不是ASP。在IS50中,服务器端的包含指令 能够比以前更加容易地集成到一个远程站点上的ASP页,它们是有用的,特别是作为执行操 作系统命令或原有的CGI应用程序的一种方式。后面将会非常详细地介绍可用的指令 # include指令是这些指令之一,它已经与ASP一起使用了一段时间了,同样也在SSI页中 使用。事实上,这已经对那些不具备传统的Web开发背景的ASP开发人员带来了很多混乱。 421不可思议的ASP# nclude指令 在一个ASP页中,可以使用# include指令把另一个文件的内容插入到当前的页面中 :--#include file=/scripts/usefulbits.inc' 这条指令读取该文件的全部内容并插入到该页中,替代<!-# include->行。这是一种非 常有用的插入HTML段落的技术,可反复使用。也常用该指令来插入代码段。例如,如果有 一个包含几个脚本函数(或者只是单行脚本代码)的文件同时在几个页面中使用,则可以使用 include指令将其插入到需要它的每个页中 通过把脚本和内容分开的方法,给页面提供了一个组成层次。这意味着如果对脚本进行 了修改,在客户端再次打开该页面时,脚本的修改情况自动地反映到使用包含文件的每个页 面中。包含文件也是一种插入服务器特定的信息的简单方法,所以把站点转移到另一个服务 器不意味着必须编辑涉及原来服务器的所有页面(明显的例子是数据库连接字符串或指定一个 完整的URL或服务器名字的链接)。这可以极大地减少维护费用 例如,可以把下面的内容作为一个包含文件,命名为 connectInc trconnect SErveR=myserver; DATABASE-mydb; DRIVER=i SQL Server)i &"UID=username: PWDasecretpassword 然后可以在任何页中使用这个文件: --#include file="path to file\connect inc strTheConnectionString strconnect'Prom include file
面中所有的服务器端包含语句,结果 (如有的话)插入到服务器的响应中,即插入到客户端接收 到的页面中。 因为这些文件是映射到 s s i n c . d l l文件而不是映射到A S P动态链接库( a s p . d l l )的,所 以在这些页面中的所有A S P代码将被忽略并且按照原有状态传送给客户端,客户端将 能够看到这些脚本。然而,在 ASP 3.0版本中有一个避免这种情况的方法,稍后在讨 论S e r v e r对象的E x e c u t e和Tr a n s f e r方法时,研究这个方法。 4.2 服务器端的包含指令 利用服务器端的包含 ( S S I )语句(或者指令)能够做些什么呢?实际上不多,除非打算创建 在We b服务器上运行的可执行文件,并通过 s t d i n和s t d o u t函数访问I S A P I。这就意味能够用 C、 C + +或其他语言(如D e l p h i )等编写它们,但V B并不适合。此外,使用 S S I指令能够做的事情可 达到与在A S P中实现同样好的效果。许多方法中, I I S的S S I特性对使用这些特性的原有的 We b 网站和We b页面具有向下兼容性。 然而,可能有时会希望在站点上使用 S S I而不是A S P。在IIS 5.0中,服务器端的包含指令 能够比以前更加容易地集成到一个远程站点上的 A S P页,它们是有用的,特别是作为执行操 作系统命令或原有的C G I应用程序的一种方式。后面将会非常详细地介绍可用的指令。 # i n c l u d e指令是这些指令之一,它已经与 A S P一起使用了一段时间了,同样也在 S S I页中 使用。事实上,这已经对那些不具备传统的 We b开发背景的A S P开发人员带来了很多混乱。 4.2.1 不可思议的ASP #include指令 在一个A S P页中,可以使用# i n c l u d e指令把另一个文件的内容插入到当前的页面中: 这条指令读取该文件的全部内容并插入到该页中,替代 < ! --# include..-->行。这是一种非 常有用的插入 H T M L段落的技术,可反复使用。也常用该指令来插入代码段。例如,如果有 一个包含几个脚本函数 (或者只是单行脚本代码 )的文件同时在几个页面中使用,则可以使用 # i n c l u d e指令将其插入到需要它的每个页中。 通过把脚本和内容分开的方法,给页面提供了一个组成层次。这意味着如果对脚本进行 了修改,在客户端再次打开该页面时,脚本的修改情况自动地反映到使用包含文件的每个页 面中。包含文件也是一种插入服务器特定的信息的简单方法,所以把站点转移到另一个服务 器不意味着必须编辑涉及原来服务器的所有页面 (明显的例子是数据库连接字符串或指定一个 完整的U R L或服务器名字的链接)。这可以极大地减少维护费用。 例如,可以把下面的内容作为一个包含文件,命名为 c o n n e c t . i n c: 然后可以在任何页中使用这个文件: 100计计ASP 3 高级编程 下载
e10 使用包含文件的另一种情况是有些内容需要按指定的时间间隔进行修改。例如,在Wrox Web Developer站点上显示书目列表的网页,它包含了一个表,其中提供了所有的封面、书名 和一些按钮,如图4-2所示。这个表的HTML和文本保留在一个单独的文件中,该文件通过 条单独的# nclude语句包含在主页中。每次一本新书加入到该网页所基于的数据库中时,那个 包含文本文件根据该数据库的情况重新创建,并作为一个文本文件写到磁盘上 a The Wow Web-De Fe Edt Yiew wrox IES DYnamic HIML IE5 ML Programmer Book Store Programmer's Reference Implementation Reference (Samples) Reference ADSI CDO ASP Programmers Resource Kit with ASP samala int asp?bookcode.1908 图4-2显示书目列表的网页 这个技术大大地减少了在Web服务器和数据库服务器上的工作量,对该站点的访问者实 现较快地响应 包含文件和ASP 在ASP网页(即带有asp文件扩展名的网页)中使用的# include指令不能像一条真正的SS指 令那样进行处理,它仅是一条ASP能够识别并进行语法分析的特别指令。sinc.d直接用于执 行SSI# include指令。然而这个由相应文件的内容替代# include指令的页面由ASP解释 这意味着ASP对# include指令所进行的操作不实施控制。例如,可以试验以下代 hBw11*not·w。xk strIncludeURL, Request Form('FileName") -# include file=”<暑= strIncludeurI8>-->
使用包含文件的另一种情况是有些内容需要按指定的时间间隔进行修改。例如,在 Wr o x Web Deverloper站点上显示书目列表的网页,它包含了一个表,其中提供了所有的封面、书名 和一些按钮,如图 4 - 2所示。这个表的 H T M L和文本保留在一个单独的文件中,该文件通过一 条单独的# i n c l u d e语句包含在主页中。每次一本新书加入到该网页所基于的数据库中时,那个 包含文本文件根据该数据库的情况重新创建,并作为一个文本文件写到磁盘上。 图4-2 显示书目列表的网页 这个技术大大地减少了在 We b服务器和数据库服务器上的工作量,对该站点的访问者实 现较快地响应。 1. 包含文件和A S P 在A S P网页(即带有. a s p文件扩展名的网页 )中使用的# i n c l u d e指令不能像一条真正的 S S I指 令那样进行处理,它仅是一条 A S P能够识别并进行语法分析的特别指令。 s s i n c . d l l直接用于执 行SSI #include指令。然而这个由相应文件的内容替代 # i n c l u d e指令的页面由A S P解释。 这意味着A S P对# include指令所进行的操作不实施控制。例如,可以试验以下代码: 第 4章 服务器进程和A S P S e rv e r对象计计101 下载
102 ASP3高级编程 Chinapub.com 下载 sinc. dI将查找名为<%= strIncludeuRL%的文件,并且不可能找到,因此这段代码不会 2.包含文件的安全性 如果没有包含可执行脚本,在Web服务器上的ASP网页不能通过IS的Web服务程序下载到 个客户端。但是,有人已经发现了偶然的安全性漏洞,比如著名的S$DATA问题,所有在 NTFS格式化的磁盘上保留Web内容的Web服务器都存在相应的问题。在IS5.0中这个问题已 经得到解决。 DATA问题的出现是因为在 WindOws ntes驱动器上的所有文件都有一个缺省的 “值”,即是该文件的内容,并且通过文件名加后缀“::$DATA”来指示。将其增加 到一个ASP页的URL的末尾将打乱IS中的脚本映射关系,且允许服务器不对其中包 含的脚本进行处理而下载该页面。对ISS40和早期版本,有一个方法可以解决这个 问题,或者可以只是增加几个映射来强制IS正常地执行该网页:即增加对“asp: $DATA”和“asa:$DATA”的映射,两者都指向asp.d件。 包含文件的扩展名一般是.inc或txt。如果在站点上发现一个包含文件的路径和文件名 可通过把包含文件的URL键入到浏览器的地址栏中,下载该包含文件,而不会把其作为ASP 网页的一部分来执行。为防止出现这样情况,特别是在文件包含有敏感信息(诸如一个数据库 链接字符串)的情况下,可能希望包含文件的扩展名为asp。在这种情况下,如果试图下载一 个包含文件,它将首先被传送到ASP,ASP将执行该文件中的所有脚本代码,并只发送出结果。 如在包含文件中定义的一个链接字符串如下: strConnect = "SERVER=myserver; DATABASE mydb; DRIVER=(SQL Server); "UID=username: PWD=secretpassword Response. Write vbcrlf 'Output a carriage return character 客户端只能接受到单个回车符而不是脚本代码,因为该文件已经被ASP在服务器上执行 了。如果不包含回车换行符,浏览器将挂起并等待一个响应(这并不是我们的问题,因为我们 确实不打算允许用户直接访问这个文件 IIS5.0和 Windows的访问控制列表 在IS50中, Microsoft已经改变了web服务器和操作系统访问服务器端包含文件的方法 在IS早期的版本中,当 sinc . d载入一个虚拟URL(即使用 RTUAL=" filename"而不是 FILE=" filename")定位的一个包含文件时,将绕过 indows本身的安全性检查并忽略该文件 及所存储的目录上的任何安全性设置。现在,在IS5.0中,运行当前ASP或SSI页面的帐号必 须与对该文件和目录在 Windows访问控制列表(ACL)中设置的权限相一致。如果不一致,该 SSI指令运行将失败。 4.2.2服务器端包含指令概要 除了已经讨论过的# include语句以外,还有IS支持的五条服务器端包含指令(记住,除 # include以外,这些语句不能在ASP网页中执行)。这些服务器端包含指令及说明如表4-1所
s s i n c . d l l将查找名为<% =strIncludeURL %>的文件,并且不可能找到,因此这段代码不会 工作。 2. 包含文件的安全性 如果没有包含可执行脚本,在 We b服务器上的A S P网页不能通过I I S的We b服务程序下载到 一个客户端。但是,有人已经发现了偶然的安全性漏洞,比如著名的 $ D ATA问题,所有在 N T F S格式化的磁盘上保留 We b内容的We b服务器都存在相应的问题。在 IIS 5.0中这个问题已 经得到解决。 $ D ATA问题的出现是因为在Windows NTFS驱动器上的所有文件都有一个缺省的 “值”,即是该文件的内容,并且通过文件名加后缀“::$ D ATA”来指示。将其增加 到一个A S P页的U R L的末尾将打乱I I S中的脚本映射关系,且允许服务器不对其中包 含的脚本进行处理而下载该页面。对 ISS 4.0和早期版本,有一个方法可以解决这个 问题,或者可以只是增加几个映射来强制 I I S正常地执行该网页:即增加对“ . a s p:: $ D ATA”和“. a s a::$ D ATA”的映射,两者都指向a s p . d l l文件。 包含文件的扩展名一般是 . i n c或. t x t。如果在站点上发现一个包含文件的路径和文件名, 可通过把包含文件的 U R L键入到浏览器的地址栏中,下载该包含文件,而不会把其作为 A S P 网页的一部分来执行。为防止出现这样情况,特别是在文件包含有敏感信息 (诸如一个数据库 链接字符串)的情况下,可能希望包含文件的扩展名为 . a s p。在这种情况下,如果试图下载一 个包含文件,它将首先被传送到A S P,A S P将执行该文件中的所有脚本代码,并只发送出结果。 如在包含文件中定义的一个链接字符串如下: 客户端只能接受到单个回车符而不是脚本代码,因为该文件已经被 A S P在服务器上执行 了。如果不包含回车换行符,浏览器将挂起并等待一个响应 (这并不是我们的问题,因为我们 确实不打算允许用户直接访问这个文件 )。 IIS 5.0和Wi n d o w s的访问控制列表 在IIS 5.0中,M i c r o s o f t已经改变了We b服务器和操作系统访问服务器端包含文件的方法。 在I I S早期的版本中,当s s i n c . d l l载入一个虚拟U R L (即使用V I RTUAL = "filename" 而不是 FILE = "filename")定位的一个包含文件时,将绕过 Wi n d o w s本身的安全性检查并忽略该文件 及所存储的目录上的任何安全性设置。现在,在 IIS 5.0中,运行当前A S P或S S I页面的帐号必 须与对该文件和目录在 Wi n d o w s访问控制列表 ( A C L )中设置的权限相一致。如果不一致,该 S S I指令运行将失败。 4.2.2 服务器端包含指令概要 除了已经讨论过的 # i n c l u d e语句以外,还有 I I S支持的五条服务器端包含指令 (记住,除 # i n c l u d e以外,这些语句不能在 A S P网页中执行 )。这些服务器端包含指令及说明如表 4 - 1所 示。 102计计ASP 3 高级编程 下载