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' 这条指令读取该文件的全部内容并插入到该页中,替代行。这是一种非 常有用的插入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指令把另一个文件的内容插入到当前的页面中: 这条指令读取该文件的全部内容并插入到该页中,替代 行。这是一种非 常有用的插入 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=”-->
使用包含文件的另一种情况是有些内容需要按指定的时间间隔进行修改。例如,在 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将查找名为的文件,并且不可能找到,因此这段代码不会 工作。 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 高级编程 下载
hd0N.2,m如m103 下载 表4-1服务器端包含指令及说明 #include 把一个指定文件的内容插入到将被发送给客户端的响应流中并代替该指令。例如: 设置由其后的SSI指令返回的日期和时间的格式。这个例子设置了一个格式风格: Saturday August14199910:34:50。可以用于格式字符串的标志的列表在附录C中给出 #config SIZEEMT ="BYTES 设置由其后的IS指令返回的文件大小的单位。这个例子设置单位为字节。对 SIZEFMT可供 选择的值是" ABBREV",指明计算值将以千字节(KB)返回文件的大小 把一个HTTP环境变量的值插入到发送给客户端的响应流中并替换该指令。例如: OT VAR=SERVER NAME 写出正在执行指令到该网页的服务器的名字 执行一个程序或一个服务器外壳命令,例如 象# include指令一样,也可以使用虚拟路径对该文件进行定义,如: VIRTUAL="/mysite/usefulbits inc VIRTUAL="./thisbit/usefulbits inc" IISRESET实用程序 lIsreset. exe是由IS50提供的一个新的实用程序。作为一个命令行的实用程序,如果用于 执行该实用程序的帐号具有管理员权限,它对于控制运行在本地或一个网络计算机上的
表4-1 服务器端包含指令及说明 指 令 说 明 # i n c l u d e 把一个指定文件的内容插入到将被发送给客户端的响应流中并代替该指令。例如: 这条指令把名为u s e f u l b i t s . i n c文件的内容插入到响应中。这个文件可以由一个相对或全路径 与文件名的组合描述,如 F I L E = " . . \ s c r i p t s \ m y s c r. i n c "。通过使用V I RT U A L属性,可使用一个虚 拟的相对或绝对路径来描述它,例如: # c o n f i g 说明在其后的指令中将用于数据、时间和文件大小以及返回给客户端的一般性的 S S I错误信 息的文本的格式。例如: 设置S S I错误信息内容为'SSI Processing Error'。 设置由其后的S S I指令返回的日期和时间的格式。这个例子设置了一个格式风格: S a t u r d a y, August 14 1999 10:34:50。可以用于格式字符串的标志的列表在附录 C中给出。 设置由其后的I I S指令返回的文件大小的单位。这个例子设置单位为字节。对 S I Z E F M T可供 选择的值是" A B B R E V ",指明计算值将以千字节( K B )返回文件的大小 # e c h o 把一个H T T P环境变量的值插入到发送给客户端的响应流中并替换该指令。例如: 写出正在执行指令到该网页的服务器的名字 # e x e c 执行一个程序或一个服务器外壳命令,例如 执行名为m y a p p . e x e的C G I程序,允许传递查询字符串,程序在单独内存中执行。 启动特定操作系统命令解释器 ( c m o . e x e )并执行命令m s r e s e t / s t o p。/ c表示当命令结束时,命 令解释器也结束。使用C M O要添加下列注册表项: H K E Y _ L O C A L _ M A C H I N E / S Y S T E M / C u r r e n t C o n t r o l S e t / S e r v i c e s / w 3 S V C /Parameters/SSIEnableCmdDirective 设置值为1 ,并重启动W W W服务,就允许 C M D标志用于# exec指令中。值为 0 ,则禁止使用, 并防止未验证的使用 # f l a s t m o d 把一个指定的文件上一次修改的日期和时间插入到发送给客户端的响应流中并代替该指令。 例如: 像# i n c l u d e指令一样,也可以使用虚拟路径对该文件进行定义,如: V I R T U A L = " / m y s i t e / u s e f u l b i t s . i n c " 或 V I R T U A L = " . . / t h i s b i t / u s e f u l b i t s . i n c " # f s i z e 把一个指定的文件的大小插入到发送给客户端的响应流中并代替该指令。例如: 象# i n c l u d e指令一样,也可以使用虚拟路径对该文件进行定义,如: V I R T U A L = " / m y s i t e / u s e f u l b i t s . i n c " 或 V I R T U A L = " . . / t h i s b i t / u s e f u l b i t s . i n c " 1. IISRESET实用程序 i i s r e s e t . e x e是由IIS 5.0提供的一个新的实用程序。作为一个命令行的实用程序,如果用于 执行该实用程序的帐号具有管理员权限,它对于控制运行在本地或一个网络计算机上的 第 4章 服务器进程和A S P S e rv e r对象计计103 下载
104 SP3高级编程 Chinaopub.com 下载 Internet连网服务是非常有用的。它可用于以正确的顺序停止或启动所有的服务、显示服务的 状态、重新引导服务器以及允许或禁止服务的管理。例如: iisreset /RESTART /TIMEOUT: 30 /REBOOTONERROR 这将以正确的顺序停止和重新启动所有 Internet服务。如果一种服务在指定的超时周期(30 秒)内未能停止或重新启动,服务器将重新引导。可以用在CMD类型的# cho ssi指令中的 些开关,使该页面不能进行匿名访问并且要求用户提供在目标服务器上具有管理员权限的有 效帐号的详细情况。这个实用程序的完整描述和可用的命令开关在附录C中。 2. NET STOP和 NET START命令 如果用来执行实用程序 net. exe的帐号具有管理员权限,它可以用来管理服务器上运行的 任何服务(既可以是本地的也可以是来自其他的一个计算机)。虽然不提倡把该程序用于 Internet服务(如wwW或FTP服务),但其停止和启动其他服务的功能是非常有用的。事实上, net命令同样可以用于一系列的其他网络相关命令 语法是 service name 例如,可以用命令 net stop cisvc和 net start cisse来停止和启动 Microsoft indexing service 可以用CMD类型的# echo SsI指令使该页面不能进行匿名访问并要求用户提供在目标服务器上 具有管理员权限的有效帐号的详细情况。稍后将看到一个这样的例子 在 Windows200帮助文件中可以找到ne命令的所有选项和开关的一个完整列表。 从 Start菜单中选择Help项,在Help窗口的 Index页查找“ net commands" 42.3服务器端包含指令的例子 本节提供了一些示例页面,可以用来对各种服务器端包含语句进行实验。打开示例网页 的子目录 Chapter04,显示“ SSI Directives and the ASP Server Object”主页(即子目录 Chapter4中的 Default. asp),如图4-3所示。 3551 Directives and the A5P Server Object.Microsoft Ind Ele Edr yiew Favose Iooks Hep SSI Directives and the ASP Server object Statements Jsing the rexec sE Side Include Directive Lsnaa ASP sarver obc e1999 Wrox Press-Professonel AsP 3. D(tsBN: 1-861002-61-D 图4-3示例网页 本书的所有示例都可以从我们的web网站下载。读者将在示例的子目录 Chapter4中发现本章其余部分的所有示例页面a
I n t e r n e t连网服务是非常有用的。它可用于以正确的顺序停止或启动所有的服务、显示服务的 状态、重新引导服务器以及允许或禁止服务的管理。例如: 这将以正确的顺序停止和重新启动所有 I n t e r n e t服务。如果一种服务在指定的超时周期 ( 3 0 秒)内未能停止或重新启动,服务器将重新引导。可以用在 C M D类型的#echo SSI指令中的一 些开关,使该页面不能进行匿名访问并且要求用户提供在目标服务器上具有管理员权限的有 效帐号的详细情况。这个实用程序的完整描述和可用的命令开关在附录 C中。 2. NET STO P和NET STA RT命令 如果用来执行实用程序 n e t . e x e的帐号具有管理员权限,它可以用来管理服务器上运行的 任何服务 (既可以是本地的也可以是来自其他的一个计算机 )。虽然不提倡把该程序用于 I n t e r n e t服务(如W W W或F T P服务),但其停止和启动其他服务的功能是非常有用的。事实上, n e t命令同样可以用于一系列的其他网络相关命令。 语法是: net [ start | stop ] service_name 例如,可以用命令net stop cisvc和net start cisvc来停止和启动Microsoft Indexing Service。 可以用C M D类型的#echo SSI指令使该页面不能进行匿名访问并要求用户提供在目标服务器上 具有管理员权限的有效帐号的详细情况。稍后将看到一个这样的例子。 在Windows 2000帮助文件中可以找到n e t命令的所有选项和开关的一个完整列表。 从S t a r t菜单中选择H e l p项,在H e l p窗口的I n d e x页查找“net commands”。 4.2.3 服务器端包含指令的例子 本节提供了一些示例页面,可以用来对各种服务器端包含语句进行实验。打开示例网页 的子目录 C h a p t e r 0 4,显示“ SSI Directives and the ASP Server Object”主页 (即子目录 C h a p t e r 0 4中的D e f a u l t . a s p ),如图4 - 3所示。 图4-3 示例网页 本书的所有示例都可以从我们的 We b网站下载。读者将在示例的子目录 C h a p t e r 0 4中发现本章其余部分的所有示例页面。 104计计ASP 3 高级编程 下载
Chinapub.comwui&sAReMasSmorwg105 载 1.使用SSI/CGI处理指令 单击链接进入“ Server- Side include and cgi statements”页面,这将打开 SSI cg1.stm网页 需要注意的是该页面的文件扩展名为stm,表明这不是一个ASP网页。该页面使用了前面已经 讨论过的除#xec指令(稍后将看到)以外的所有SS指令,且显示指令的使用方法和结果,如图 assl and CGI Instractions- Micotoll Intenet Explore SSI and CGI Instructions Including Files with SSI been nserted nt the page usng the ServerSide Incude (ssi)structon: ado fon"ta.n一 SSI Statements (sets error message n case of ssI error Details of file Default asp sconfi SIzEFMTsBYTE5-> (sets fsize to retrn size n bytes) chee FlE='Default. asp->returns: 121 byte sconfig TIMEFMT= "%A, .B %d %Y %+: %.M: %"-->(sets for mat for date/time results) reurns: Saturday, August 14 1999 10: 34: 50 Http Variables echo VAR=战THT…> return fecho VAR="AUTH PASSWORD"-> returns returns:0 - fecho VARa DOCUMENT_NAME"-> returns: c: \in returns:/2610/ cl- fecho VAR=DATE- GMT-->returns: Thursday, Au ychapter04/ss_cg/ss_cgl stm seco VAR=DATE LOCAL"->rerms: Thursday, August 19 1999 13: 10: 46 echo VARe GATEWAY_INTERFACE'>retums: CGI/1.1 returns: appication/ msword, appia 图4-4示例网页显示的 SSI/CGI处理指令情况 (1)# include指令 该页的开始部分“ Include files with ssi”,显示名为 intro. inc的另一个单独文件的内容。 下面是该文件的全部内容: 注意我们必须使用HTML条目“<”和“>”来显示网页中的尖括号。如 果不这样做,它们就不能被当作注解元素部分看待,并引起其中的指令被执行。 在主 SSI cgl. stm页面中,把这个文件插入到该页中的代码是很简单的 sSI Statements <:!--#config ERRMSG="SSI Processing Error.-->:
1. 使用S S I / C G I处理指令 单击链接进入“S e r v e r-Side Include and CGI Statements”页面,这将打开s s i _ c g i . s t m网页。 需要注意的是该页面的文件扩展名为 . s t m,表明这不是一个A S P网页。该页面使用了前面已经 讨论过的除# e x e c指令(稍后将看到)以外的所有S S I指令,且显示指令的使用方法和结果,如图 4 - 4所示。 图4-4 示例网页显示的S S I / C G I处理指令情况 (1) #include指令 该页的开始部分“ Include Files with SSI”,显示名为i n t r o . i n c的另一个单独文件的内容。 下面是该文件的全部内容: 注意我们必须使用H T M L条目“& l t;”和“& g t;”来显示网页中的尖括号。如 果不这样做,它们就不能被当作注解元素部分看待,并引起其中的指令被执行。 在主s s i _ c g i . s t m页面中,把这个文件插入到该页中的代码是很简单的: (2) #config、# f s i z e和# f l a s t m o d指令 网页下一部分显示了与该页面在相同的目录中的文件 D e f a u l t . a s p的大小和最后被修改的时 间。这里三次使用了# c o n f i g指令: • 一次是设置S S I错误信息。 • 一次是设置日期和时间的格式。 • 一次是设置文件大小计算的格式。 使用# f s i z e和# f l a s t m o d指令把值插入到该网页中: 第 4章 服务器进程和A S P S e rv e r对象计计105 下载
106:;商程 Chinaopub.com (sets error message in case of ssI error) Details of file 'Default. asp: &1t;!-# config s工ZEF=" BYTES·--> (sets fsize to return size in bytes) 1t;!--#f FILE="Default. asp.--> returns: bytes (set config TIMEFMT="告A,B影Y暑H:别M:8s·一-gt;&nbBp format for date/time results) <I--#flastmod FILE='Default. asp.-->: returns: Http Variables #echo vAR"AUTH_TYPE.-->i returns: 2.使用#exec指令 #exec指令与其他的SSI指令相比使用起来困难一些,正因为如此,将其独立地放到了另 个页面上。可以从“ ASP Sever Object and ssI Directives”主菜单上访问启动页面。 在该页面上,选择“ Using the# echo E The SSI Bewec Duective. Micronolt Inte回 Server- Side include directive”链接。这个 操作打开“ The ssi# exec Directive”页面, The SSi #exec Directive 如图4-5所示。 这是一个ASP网页 sSI exec. aspo两个‖ Stopping and Starting a Service 按钮用来打开.stm页面,该页面执行其中 使用#exec指令所描述的动作 a stop the Microsoft Indexing Service (1)在服务器上运行这个示例 Start the Microsoft Indexing Service 在SSI#exec指令示例能够在服务器上 工作之前,必须对一些配置进行修改。首 o1999Wrox Press- Professonal ASP 3, Q(IsBN: 1-861002-61-0 先,需要在Web服务器的注册表中创建 SSIEnableCmdDirective项(类型 DWORD), 图45“ The ssi# exec Directive”网页 位置在下面的键名下 HKEY LOCAL_ MACHINE\ SYSTEM\ CurrentcontrolSet\Services\W3SvC\Parameter 然后设置该值为1,如图4-6所示。 这样就允许#exec指令与CMD属性一起使用。 其次,必须对包含使用#exec指令的.stm文件的目录禁止匿名访问,客户端将被强制提供
(3) #echo指令 该页的最后部分(在屏幕上只能看到一部分 )显示可以使用# e c h o指令访问的所有H T T P报头 的内容。每一行的代码都是相同的,仅仅是 VA R属性值有变化。附录G中给出了VA R属性的所 有容许值的一个完整列表。 2. 使用# e x e c指令 # e x e c指令与其他的 S S I指令相比使用起来困难一些,正因为如此,将其独立地放到了另 一个页面上。可以从“ASP Sever Object and SSI Directives”主菜单上访问启动页面。 在该页面上,选择“ Using the #echo S e r v e r-Side Include Directive”链接。这个 操作打开“The SSI #exec Directive”页面, 如图4 - 5所示。 这是一个A S P网页s s i _ e x e c . a s p。两个 按钮用来打开 . s t m页面,该页面执行其中 使用# e x e c指令所描述的动作。 (1) 在服务器上运行这个示例 在SSI #exec指令示例能够在服务器上 工作之前,必须对一些配置进行修改。首 先,需要在 We b服务器的注册表中创建 S S I E n a b l e C m d D i r e c t i v e项(类型D W O R D ), 位置在下面的键名下: 然后设置该值为1,如图4 - 6所示。 这样就允许# e x e c指令与C M D属性一起使用。 其次,必须对包含使用 # e x e c指令的. s t m文件的目录禁止匿名访问,客户端将被强制提供 106计计ASP 3 高级编程 下载 图4-5 “The SSI #exec Directive”网页
inapub.commaBsHeFrASSneWg107 下载 帐号的详细情况,该帐号应是一个具有管理员级权限的帐号。这也是net命令正常工作的要 Pavor 白w3sc (a) RFG 5 (valum not ser) 主Q ablAcceseDeriedMessace REG_5Z Ercc Aaess Dened C:wNT5ytm钟时vsm的 cnADCaunch ablinstyipath n Satt Map R6_5 F stud Roots REG DWORD Ox0000o00s(5) PErfomance REG DWORD OD0000000(0) n Security ssanabedmdDrectme N RL DwoRD 0et000001(1) 图46注册表中的设置 激活 Internet Services Manager应用程序,并选择包含使用#exec指令的stm文件的目录(在 示例中,这些文件是exec目录下的 start CIsvc.stm和 stop cisvc.stm)。然后打开该目录的 Properties对话框。在 Directory Security选项卡中单击 Anonymous access and authentication control区域中的Edit按钮,打开 Authentication methods对话框,如图4-7所示 used a Moyno Nc F)ac ouherdcoon espioefi w nc图 Seect a a dsn 图4-7设置验证方法的对话框 在这个对话框中不选中 Anonymous access复选框。如果不使用 Internet Explorer访问该页 面,打开 Basic authentication选项以允许非IE浏览器通过提交用户名/口令访问该页面。设置时, 会出现一个有关安全性的警告,单击Yes。现在浏览器将被强制出示合适的帐号和身份证明
帐号的详细情况,该帐号应是一个具有管理员级权限的帐号。这也是 n e t命令正常工作的要 求。 图4-6 注册表中的设置 激活Internet Services Manager应用程序,并选择包含使用 # e x e c指令的. s t m文件的目录(在 示例中,这些文件是 e x e c目录下的 s t a r t _ c i s v c . s t m和s t o p _ c i s v c . s t m )。然后打开该目录的 P r o p e r t i e s对话框。在 Directory Security选项卡中单击 Anonymous access and authentication c o n t r o l区域中的E d i t按钮,打开Authentication Methods对话框,如图4 - 7所示。 图4-7 设置验证方法的对话框 在这个对话框中不选中 Anonymous access复选框。如果不使用 Internet Explorer访问该页 面,打开Basic authentication选项以允许非I E浏览器通过提交用户名/口令访问该页面。设置时, 会出现一个有关安全性的警告,单击 Ye s。现在浏览器将被强制出示合适的帐号和身份证明, 第 4章 服务器进程和A S P S e rv e r对象计计107 下载