下载第 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控件等内容。这里的动态页是专指服务器响应客户端请求而产生的页面,并且根据情况每次产生的页面可能是不同的。
举个简单的例子,创建一个只包含当前日期和时间的页面。每次请求该页面时将显示一个不同的值,因为日期和时间取决于服务器的时钟,或取决于提供日期和时间的一个资源 (例如一个独立的服务器或来自于互联网上一个标准时钟 )。当然,实际上动态页要比这复杂得多,
也许显示数据库记录的当前值或者邮件服务器上等待着的邮件消息的摘要。重要的是服务器不仅阅读一个无格式的 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下载面中所有的服务器端包含语句,结果 (如有的话 )插入到服务器的响应中,即插入到客户端接收到的页面中。
因为这些文件是映射到 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 高级编程 下载使用包含文件的另一种情况是有些内容需要按指定的时间间隔进行修改。例如,在 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下载
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 高级编程 下载表 4-1 服务器端包含指令及说明指 令 说 明
# i n c l u d e 把一个指定文件的内容插入到将被发送给客户端的响应流中并代替该指令。例如:
< ! -- # include FILE = "usefulbits.inc " -- >
这条指令把名为 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属性,可使用一个虚拟的相对或绝对路径来描述它,例如:
< ! -- #include VIRTUAL="/mysite/usefulbits.inc" -- >
< ! -- #include VIRTUAL="../../thisbit/usefulbits.inc" -- >
# c o n f i g 说明在其后的指令中将用于数据、时间和文件大小以及返回给客户端的一般性的 S S I错误信息的文本的格式。例如:
< ! -- #config ERRMSG="SSI Processing Error" -- >
设置 S S I错误信息内容为 'SSI Processing Error'。
< ! -- #config TIMEFMT = "%A,%B %d %Y %H,% M,%S" -- >
设置由其后的 S S I指令返回的日期和时间的格式。这个例子设置了一个格式风格,S a t u r d a y,
August 14 1999 10:34:50。可以用于格式字符串的标志的列表在附录 C中给出。
< ! -- #config SIZEFMT = "BYTES" -- >
设置由其后的 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环境变量的值插入到发送给客户端的响应流中并替换该指令。例如:
< ! -- #echo VAR="SERVER_NAME" -- >
写出正在执行指令到该网页的服务器的名字
# e x e c 执行一个程序或一个服务器外壳命令,例如
<!--#exec CGI="/scripts/myapp.exe? valuel= this & value2= that-->
执行名为 m y a p p,e x e的 C G I程序,允许传递查询字符串,程序在单独内存中执行。
<!--#execCMD="cmd.exe/c iisreset/stop" - ->
启动特定操作系统命令解释器 ( 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 把一个指定的文件上一次修改的日期和时间插入到发送给客户端的响应流中并代替该指令。
例如:
< ! -- #flastmod FILE="Default.asp" -- >
像 # 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 把一个指定的文件的大小插入到发送给客户端的响应流中并代替该指令。例如:
< ! -- #fsize FILE="Default.asp" -- >
象 # 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下载
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 高级编程 下载
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下载
(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”网页帐号的详细情况,该帐号应是一个具有管理员级权限的帐号。这也是 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下载因为不能匿名访问该网页。
为了能看到启动和终止服务的结果,打开 Services MMC插件”,终止 Indexing Service,如图 4 - 8所示。
图 4-8 启动和终止服务的屏幕
(2) 启动和终止 Indexing Service
单击示例 We b网页上的按钮,启动 Microsoft Indexing Service。
这个服务的短名称为 c i s v c,它通常称为 Microsoft Index Server,名称中的,c i”
字符,实际上代表,content indexer” 。
出现提示时,输入在 We b服务器上的具有管理员权限的一个帐号的用户名和口令。当该页面 ( s t a r t _ c i s v c,s t m )打开时,你将感觉到一定的延迟,这是因为 # e x e c指令载入一个窗口命令解释器 ( c m d,e x e )的实例,然后执行 net start命令。一旦服务启动 (或者如果已经在运行 ),将显示该页面的其余部分,如图 4 - 9所示。
图 4-9 输入用户名和口令后显示的界面这个页面的代码十分简单。可以看到 # e x e c指令带有 C M D属性,它设置为,cmd.exe /c net
start cisvc” 。窗体包含有重新回到前一页面的 S U B M I T按钮:
108计计 ASP 3 高级编程 下载从前一页面可以打开其他的,s t m网页,如 s t o p _ c i s v c,s t m用来再次终止该服务,不同之处仅在于使用了 net stop命令而不是 net start命令。
4.3 ASP Server对象正像在前面看到的那样,通过服务器端包含的经 I S A P I访问 We b服务器的页面,用传统的动态页面指令和命令可以做相当多的事情。但同时也有一些明显的限制。
例如,可以从 R e q u e s t,S e r v e r Va r i a b l e s集合检索到所有随同客户端的请求发送过来的 H T T P
报头的值。它几乎可以与使用 S S I # e c h o 相匹敌,同时具备的主要优点是把这些值作为字符串返回到代码中(而 # e c h o指令简单地把这些值插入到页面中),因此可以根据自己的愿望来检索和维护这些字符串。许多相同的参数应用于 # f s i z e和 # f l a s t m o d指令,使用带有 V B S c r i p t和
J S c r i p t脚本引擎中的对象的脚本,同样也可以容易地获取这个信息。在后续章节你将看到相关的细节。
# e x e c指令既非常有用,又受到一定的限制。实际上该指令仅运行系统命令或定制的 C G I
应用程序,并不能给脚本提供真正的对进程的控制。 ASP Server对象提供了一种全新的方法,
与 # e x e c指令相比,能够更安全和更容易地运行其他的应用程序或组件。当然,对于一些情况,
尤其是在确实需要执行一个操作系统命令或一个原有的 C G I应用程序的地方,# e x e c是无法替代的。
为了研究 S e r v e r对象,先概要介绍其所有可用的方法和属性,然后再进一步详细地进行讨论。
4.3.1 ASP Server对象成员概述
S e r v e r对象是专为处理服务器上的特定任务而设计的,特别是与服务器的环境和处理活动有关的任务。因此提供信息的属性只有一个,却有七种方法用来以服务器特定的方法格式化数据、管理其他网页的执行、管理外部对象和组件的执行以及处理错误。
1,Server对象的属性
S e r v e r对象的唯一一个属性用于访问一个正在执行的 A S P网页的脚本超时值,如表 4 - 2所示。
表 4-2 Server对象的属性及说明特 性 说 明
S c r i p t Ti m e o u t 整型。缺省值为 9 0。
设置或返回页面的脚本在服务器退出执行和报告一个错误之前可以执行的时间
(秒数 )。达到该值后将自动停止页面的执行,并从内存中删除包含可能进入死循环的错误的页面或者是那些长时间等待其他资源的网页。这会防止服务器因存在错误的页面而过载。对于运行时间较长的页面需要增大这个值第 4章 服务器进程和 A S P S e rv e r对象 计计 109下载
2,Server对象的方法
S e r v e r对象的方法用于格式化数据、管理网页执行和创建其他对象实例,如表 4 - 3所示。
表 4-3 Server对象的方法及说明方 法 说 明
C r e a t e O b j e c t ( "i d e n t i f i e r" ) 创建由 i d e n t i f i e r标识的对象 (一个组件、应用程序或脚本对象 )的一个实例,
返回可以在代码中使用的一个引用。可以用于一个虚拟应用程序 ( g l o b a l,a s a页 )
创建会话层或应用程序层范围内的对象。该对象可以用其 C l a s s I D来标识,如
,{ c l s i d,B D 9 6 C 5 5 6 - 6 5 A 3,,,3 7 A 9 }”或一个 P r o g I D串来标识,如
,A D O D B,C o n n e c t i o n”
E x e c u t e ( "u r l" ) 停止当前页面的执行,把控制转到在 u r l中指定的网页。用户的当前环境 (即会话状态和当前事务状态 )也传递到新的网页。在该页面执行完成后,控制传递回原先的页面,并继续执行 E x e c u t e方法后面的语句
G e t L a s t E r r o r ( ) 返回 ASP ASPError对象的一个引用,这个对象包含该页面在 A S P处理过程中发生的最近一次错误的详细数据。这些由 A S P E r r o r对象给出的信息包含文件名、行号、错误代码等等
H T M L E n c o d e ( "s t r i n g" ) 返回一个字符串,该串是输入值 s t r i n g的拷贝,但去掉了所有非法的 H T M L
字符,如 <,>,&和双引号,并转换为等价的 H T M L条目,即 & l t ;,' & g t ; '、
' & a m p ; ',' & q u o t ; '等等
M a p P a t h ( "u r l" ) 返回在 u r l中指定的文件或资源的完整物理路径和文件名
Tr a n s f e r ( "u r l" ) 停止当前页面的执行,把控制转到 u r l中指定的页面。用户的当前环境 (即会话状态和当前事务状态 )也传递到新的页面。与 E x e c u t e方法不同,当新页面执行完成时,不回到原来的页面,而是结束执行过程
U R L E n c o d e ( "s t r i n g" ) 返回一个字符串,该串是输入值 s t r i n g的拷贝,但是在 U R L中无效的所有字符,如?,&和空格,都转换为等价的 U R L条目,即 % 3 F,% 2 6和 +
4.3.2 创建其他对象的实例在前一章中,讨论了 A S P的虚拟应用程序概念,了解了虚拟应用程序通过 A p p l i c a t i o n
P r o t e c t i o n设置为 A S P网页中的组件和其他对象提供进程隔离。这沿续了第 1章的讨论,即 A S P
的 O b j e c t C o n t e x t对象如何为 A S P网页提供运行环境,以及如何使用在相同的环境中运行的其他组件和对象。
ASP Server对象提供创建这些组件和应用程序实例的功能,因此可用来扩充 A S P脚本的能力。通过实现 C r e a t e O b j e c t方法的一个特定版本来实现这个功能。
1,在 V B S c r i p t和 J s c r i p t中创建对象实例在 V B或 V B A中,可使用多种方法创建对象的实例。可以使用 N e w关键字来创建指定类型的一个新对象:
然而,不能在 A S P中用 V B S c r i p t或 J S c r i p t这么做,因为这些脚本引擎不能实现数据类型定义。不能声明一个变量为任意指定的数据类型,其变量都是 Va r i a n t s类型,或一个等价的类型
(根据使用的脚本语言而定 )。
在 V B和 V B A中另一个方法是使用 C r e a t e O b j e c t或 G e t O b j e c t方法。 C r e a t e O b j e c t方法的参数是一个 C l a s s I D (通常情况 )或一个 P r o g I D字符串,它返回相应类型的一个新对象:
110计计 ASP 3 高级编程 下载当拥有一个指定的文档类型,并且想创建一个可以处理这种文档的对象实例时,通常使用 G e t O b j e c t方法:
也可以指定所需要的对象类型和文件名,在几种对象都能处理该文档类型的情况下,这种做法是非常有用的:
V B S c r i p t支持 C r e a t e O b j e c t和 G e t O b j e c t方法。 J S c r i p t也有 g e t O b j e c t方法,与 V B s c r i p t中的
G e t O b j e c t工作方式相同。 J S c r i p t中的 A c t i v e X O b j e c t实现了与 V B S c r i p t的 C r e a t e O b j e c t方法相同的功能。但这个函数常与 J S c r i p t的 n e w运算符协同使用:
除了 V B的 N e w关键字在 V B S c r i p t和 J S c r i p t中不予支持以外,能够使用所有这些技术在一个 A S P网页中创建对象的实例。然而,能够并不意味着应该,而且大多数情况下不应该在一个 A S P网页中使用脚本引擎的对象创建函数。
2,在 A S P网页中创建对象实例为了理解一般的脚本引擎对象创建方法为什么在 A S P网页中使用效果不理想,需进一步对 A S P中的环境和 O b j e c t C o n t e x t对象进行讨论。
使用脚本引擎的一般方法在一个 A S P网页中创建一个对象实例时,该对象在当前执行的页面的环境中并未实例化。得不到 O b j e c t C o n t e x t对象的引用,所以不能使用该对象来访问页面的环境,即不能访问该页面环境中的值。
这意味着该对象不能使用内置的 A S P对象,即不能够访问在 R e q u e s t,R e s p o n s e、
A p p l i c a t i o n和 S e s s i o n对象的集合中的值,也不能使用内置的 A S P对象提供的方法和属性。该对象也不能够与此环境中任何现有的事务进行交互。如果发生错误,不能使用 O b j e c t C o n t e x t
方法放弃一个事务。
当然,你可能不想与该网页的环境进行交互。但是有其他的理由说明使用一般的对象创建方法通常是不明智的。 I I S自动地在 C O M +运行期包装程序 h l l h o s t,d l l中实例化对象,使得该对象可以在当前的虚拟应用程序中完全地共享和重新使用 (缺省的 We b网站本身是一个虚拟应用 )。
你在上一章所看到的对一个虚拟应用程序的设置,既允许在 We b服务器的内存空间中创建对象,也可以在共享的或独立的进程外 D L L H o s t,d l l实例中创建对象。如果使用一般的脚本引擎对象创建方法,将绕过所有的组件隔离和可扩展特性。而在使用 ASP Server对象的
C r e a t e O b j e c t方法时会自动地提供这些特性。
3,Server对象的 C r e a t e O b j e c t方法为了试验 C r e a t e O b j e c t方法,打开示例的 C h a p t e r 0 4主菜单页,单击,Using the ASP Server
O b j e c t”链接,如图 4 - 1 0所示。
这个链接打开一个名为 s h o w _ s e r v e r,a s p的网页,该页面可以用来试验所有的 S e r v e r对象的方法。它同时也显示 S e r v e r对象唯一的属性 S c r i p t Ti m e o u t的值、其缺省值是 9 0秒,如图 4 - 11所示。
在该页面的,Create an Instance of a Component”区域,有一个文本框,可以在其中键入想要在该网页的环境中创建的对象的 P r o g I D字符串,甚至可以键入一个 C l a s s I D数值。这里文本 框 的 缺 省 值 已 经 设 置 为 一 个 来 自 A c t i v e X 数 据 对 象 库 的 公 用 对 象 的 P r o g I D,
A D O D B,C o n n e c t i o n。
第 4章 服务器进程和 A S P S e rv e r对象 计计 111下载图 4-10 示例程序的 C h a p t e r 0 4主菜单页图 4 - 11 Server对象的属性和方法单击,S e r v e r,C r e a t e O b j e c t”选项旁的按钮,把该页面提交给其自身,因为所有的控件都在一个带有 A C T I O N属性的 < F O R M >上,而这个 A C T I O N属性被设置为这个网页的路径和文件名:
112计计 ASP 3 高级编程 下载当该页面重新载入时,该页中的一段 A S P代码 (位于 < F O R M >段的前面 )将查看提交该窗体时,单击了哪个按钮。如果是名称为,c m d C r e a t e O b j e c t”的按钮,该代码将读取文本框中的
P r o g I D字符串。为防止用户输入的 P r o g I D无效而导致执行中止,关闭缺省的脚本错误处理,
再尝试使用 S e r v e r,C r e a t e O b j e c t方法创建一个对象的实例。最后,再重新打开缺省的错误处理,
通过使用 I s O b j e c t函数检查是否创建了一个对象实例,并显示一个相应的信息:
图 4 - 1 2所示的是创建 A D O D B,C o n n e c t i o n对象的结果。可以看到该对象已被正常实例化,
已可以在代码中使用。
图 4-12 ADODB.Connection对象实例化的结果本章不讨论如何使用这些对象,你可能已经对此很熟悉了。一旦创建了对象实例,就可以像在任何其他情况中一样使用它。调用对象的方法,读取或设置属性,与使用 V B时一样;
第 4章 服务器进程和 A S P S e rv e r对象 计计 113下载或者用浏览器中客户端的 V B S c r i p t,J S C r i p t使用它。
在接下来的章节中将对对象和组件的使用进行更加详细的介绍。我们将研究由脚本引擎实现的一些对象,以及 IIS 5.0/ASP 3.0中的可安装组件,还有一些其他的免费或商用的组件,
并讨论在各种情况下如何选择相应的组件。在本书的后面,甚至会说明创建自己的能够在
A S P中使用的组件是非常简单的。
4.3.3 执行其他的网页
ASP 3.0和 IIS 5.0的新特性之一就是引入了可编程的服务器端重定向 ( s e r v e r- s i d e
r e d i r e c t i o n )的概念。这意味着,可以把一个网页的控制和执行转到另外一个网页,而不需要在客户端使用 R e s p o n s e,R e d i r e c t方法。
1,客户端重定向带来的问题
A S P编程人员通常使用 R e s p o n s e,R e d i r e c t语句把一个页面载入到当前正在执行的网页。然而,许多人没有意识到这条语句不会自动地使服务器立即装入和执行新的网页。其真正做的是把一个 H T T P重定向报头 (redirection header)增加到由 We b服务器发送给客户的输出流中。这个报头如下:
在这个报头中的标准 H T T P状态信息,302 object Moved”,告知浏览器所要求的资源已经发生移动。 L o c a t i o n报头提供相应的网页地址。当然这个地址不一定是真实的,现在正在做的事情就是“欺骗”浏览器,使浏览器认为可在另一个位置上找到所需要的网页。实际发生的是,服务器将执行所请求的网页,但是通知浏览器需要的网页已经发生移动。这就是在发送任何页面的内容到浏览器之前必须执行 R e d i r e c t方法的原因。
当一个浏览器接受到,302 object Moved”信息时,中断当前的请求并为 L o c a t i o n值中指定的网页发送一个新的请求。这与在网页的 < H E A D >段使用一个 M E TA HTTP-EQUIV标记时的工作方式相同,前面给出的 H T T P报头还可写为:
因此重定向实际上发生在客户机端,而不是在服务器上。如果在这个连接的客户端有一个代理服务器在使用的话,可能会引起显示虚假消息。代理服务器通常会截取该状态信息,
并且可能产生一个页面发送给提出原始请求的客户端。这就是在使用 R e s p o n s e,R e d i r e c t时,
,The object you requested has been moved and can be found h e r e”消息经常在客户机上显示的原因,正确地使用缓冲通常可以防止这个问题。
在 IIS 4.0或更早的版本中使用 R e s p o n s e,R e d i r e c t时,应该在 A S P网页的开头打开缓冲,然后在执行 R e s p o n s e,R e d i r e c t方法之前调用 R e s p o n s e,C l e a r。当然,在 ASP 3.0
中网页缓冲的缺省状态为打开,因此这不成问题。只要在执行该语句之前使用
R e s p o n s e,C l e a r,以前产生的输出将不会发送给客户。
2,在 ASP 3.0中服务器端的重定向在 ASP 3.0和 IIS 5.0中,在几乎所有情况下,通过使用两个新的 S e r v e r对象方法 E x e c u t e和
Tr a n s f e r,可以避免使用客户端重定向。这两个方法使控制立即转到另一个网页,该网页可以是一个 A S P网页或者是任何其他的资源,例如一个 H T T P网页、压缩文件或其他类型的文件。
114计计 ASP 3 高级编程 下载它们之间的不同之处是,E x e c u t e方法“调用”另一个的网页,与在脚本代码中调用一个子程序或函数非常相似。当另一个网页或资源已经执行完毕或传送到客户端时,控制返回到原网页中调用 E x e c u t e方法的语句的下一条语句,并继续执行。而使用 Tr a n s f e r方法时,控制不再返回到原页面中,在控制传送到的网页或资源的末尾处,执行过程停止。
当前网页的环境也传送给了目标网页或资源,因此这两个方法更有用。网页环境包含了原有的 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对象的环境。
结果是浏览器认为它仍在接收原先的页面,它并不了解服务器所做的事情。浏览器的地址栏一直显示相同的 U R L,并且 B a c k,F o r w a r d和 R e f r e s h按钮正常地工作。在使用客户端重定向时,尤其是使用 HTML META元素时,情况通常不是这样的。
传送到新的页面或资源的环境包括所有现存的事务状态 (transaction state)。当前网页的环境用 A S P的 O b j e c t C o n t e x t对象 (在第 1章中已经讨论过 )进行封装。如果需要将这个对象作为一个正在进行的事务的一部分,可以在传送控制的目的页面中使用这个对象。
(1) Server对象的 E x e c u t e和 Tr a n s f e r方法的使用在前面的示例页面中,可以试验使用 E x e c u t e和 Tr a n s f e r方法。该页面包含了在示例中已经提供的另一个文件的名字 a n o t h e r _ p a g e,a s p,它作为这两个方法的缺省参数值,如图 4 - 1 3所示。
图 4-13 使用 E x e c u t e和 Tr a n s f e r方法的屏幕单击 S e r v e r,E x e c u t e和 S e r v e r,Tr a n s f e r方法的按钮,提交到此窗体并重新装载该窗体。在这个页面顶部的脚本代码查看是哪个按钮被单击。如果是 c m d E x e c u t e或 c m d Tr a n s f e r按钮,则把当前网页的路径写入到输出流中,然后调用相应的方法,并传送与该按钮相联系的文本框中的值,然后再把当前页面的路径写到输出流中。
第 4章 服务器进程和 A S P S e rv e r对象 计计 115下载当单击 S e r v e r,E x c u t e方法的按钮时,会看到当前页面的路径,这是由上面代码中的第一条
R e s p o n s e,Wr i t e语句创建并显示的。后面接着的内容是来自被执行的网页 ( a n o t h e r _ p a g e,a s p )的一些输出内容。在这之后是第二个 R e s p o n s e,Wr i t e语句的输出内容,这表明控制又回到了原先的网页。屏幕如图 4 - 1 4所示。
图 4-14 Server,E x c u t e方法的演示页面的两条水平线之间的段落 (显示当前执行的网页为 s h o w _ s e r v e r,a s p )来自原先的网页。
在接下来的段落来自被执行的网页 a n o t h e r _ p a g e,a s p。下面是该页面的完整代码:
116计计 ASP 3 高级编程 下载注意,该页面执行时,不能使用 R e q u e s t,S e r v e r Va r i a b l e s ( " S C R I P T _ N A M E " )获取它的路径,
因为环境仍然是原网页的。我们不得不把页面名作为文本写入,因为实在没有办法可以从
A S P环境中直接获取。
这里包括了一个返回前一个网页的按钮的原因是,通过在主网页中单击相对应的按钮,
可以使用 S e r v e r,Tr a n s f e r方法调用这个页面。这次看到了完全相同的输出,只是没有第二次路径输出,因为是“传送”这个页面而不是“执行”该页面,所以控制不会回传给原先的网页,
如图 4 - 1 5所示。
图 4-15 Server,t r a n s f e r的演示
(2) 从 A S P执行 S S I网页目前有了一个方法,如果需要的话可在 A S P网页中成功地使用 S S I指令。虽然这种要求不常出现,但可实现。过去的问题是,由于在 S S I网页 (文件扩展名是,s t m,,s h t m l和,s h t m )中不能包含 A S P代码,所以程序不能“无缝”地重定向回到原先的网页,必须增加一个按钮或链接,
以装载原先的或另外的 A S P网页。
现在,由于有了 S e r v e r,E x e c u t e方法,可以执行一个 S S I网页并且将控制自动返回到原先的网页,客户端意识不到这些过程正在进行。客户端只是看到原先的 A S P网页和执行结果。来自于 S S I网页的任何输出都“无缝”地插入到流中。当然,如果在 S S I网页完成后,不想使原先的网页继续执行,可以使用 S e r v e r,Tr a n s f e r方法。
为了看到这个技术的执行,把前面使用过的 C G I - S S I例子网页的虚拟路径输入到
S e r v e r,E x c u t e方法 (或 S e r v e r,Tr a n s f e r方法 )的文本框中。这个路径是,.,/ s s i _ c g i / s s i _ c g i,s t m” 。
在单击按钮对 E x e c u t e或 Tr a n s f e r方法进行调用以后,将看到,s t m网页已经执行,其中有 S S I指令的结果。在来自 s s i _ c g i,s t m的内容之后出现的是原先的网页的其余部分,虽然在图 4 - 1 6中看不到,但可通过滚动条看到该内容。
第 4章 服务器进程和 A S P S e rv e r对象 计计 117下载图 4-16 执行 S e r v e r,E x c u t e方法后的屏幕
3,SSI #exec 指令的不足遗憾的是 E x e c u t e和 Tr a n s f e r方法一般不能与 S S I的 # e x e c指令一起工作,因为包含这个指令的,s t m网页会在调用它的 A S P网页的环境中运行。在大多数情况下,它需要运行于直接引用该网页的一个独立的环境中。
存在这样的限制真是遗憾,如果没有这种限制,我们通过 S e r v e r,E x e c u t e执行的网页可以
“不可见地”包含来自于 A S P网页的 # e x e c指令。对前面的通过 net stop和 net start命令停止和启动 Indexing Service的示例来说,这可能是一种理想的解决方案。
但是,我们必须求助于老的和已经验证的方法。当用户单击一个按钮时,简单地使用
R e s p o n s e,R e d i r e c t方法来打开相关的网页:
可以试着把使用 # e x e c指令的一个 S S I网页的虚拟路径输入到示例页面的 S e r v e r,E x e c u t e和
S e r v e r,Tr a n s f e r方法的文本框中。前面使用过的 # e x e c示例的虚拟路径是,.,/ s s i _ c g i / e x e c
/ s t a r t _ c i s v c,s t m”和,.,/ s s i _ c g i / e x e c / s t o p _ c i s v c,s t m” 。
4.3.4 Server对象的错误处理
A S P没有错误处理机制一直受到批评。
118计计 ASP 3 高级编程 下载在 V B S c r i p t中,有一个 On Error Resume Next语句,它使脚本解释器忽略运行期错误并继续脚本代码的执行。接着该脚本可以检查 E r r,N u m b e r属性的值,判别是否出现了错误。如果出现错误,返回一个非零值。在 ASP 3.0中,也可以使用 On Error Goto 0“转回到”缺省的错误处理。在 ASP 2.0中实际也进行这种处理,但是没有相应文档说明。
在 J S c r i p t中,有一个新的错误处理功能,C语言风格的 t r y和 c a t c h语句。然而所有的这些错误处理技术都不是由 A S P或 I I S实现的,而是由 A S P使用的脚本引擎实现的。
第 7章专门讨论脚本和脚本引擎涉及到的调试和错误处理技术。
同时,A S P和 I I S的开发小组已经增加了一个新的功能,用于在 A S P网页中进行错误处理。
这分为两个部分,I I S错误页面的配置及使用 A S P的一个新的方法和对象。
1,Server对象的 G e t L a s t E r r o r方法在 ASP 3.0中,S e r v e r对象有一个名为 G e t L a s t E r r o r的新方法。与 V B S c r i p t的 E r r对象不同,
不能为查看是否出现了错误而随时调用该方法,只能在一个 A S P定制的错误网页中使用。如果像对 E r r对象进行操作那样,通过关闭缺省的错误处理 (用 On Error Resume Next语句 )来使用,
则 G e t L a s t E r r o r方法不能访问错误的详细数据。
G e t L a s t E r r o r方法要做的事情是提供更多的有关错误源和错误原因的信息。 G e t L a s t E r r o r
方法创建并返回一个对象的引用,该对象是一个名为 A S P E r r o r的新对象。这个对象具有一系列的属性,这些属性返回有关在 G e t L a s t E r r o r方法调用之前出现的最新错误的信息。
2,ASPError对象的属性
A S P E r r o r对象提供了九个属性说明所出现的错误的性质和错误源,并返回引发错误的实际代码,其属性及说明如表 4 - 4所示。
表 4-4 ASPError对象的属性及说明属 性 说 明
A S P C o d e 整型。由 A S P / I I S产生的错误号,例如 0 x 8 0 0 A 0 0 0 9
A S P D e s c r i p t i o n 字符串型。如果这个错误是与 A S P 相关的错误,这个属性是错误的详细说明
C a t e g o r y 字符串型。错误源,即 A S P内部脚本语言、或一个对象
C o l u m n 整型。产生错误的文件中的字符位置
D e s c r i p t i o n 字符串型。错误的简短说明
F i l e 字符串型。错误出现时正在处理的文件的名称
L i n e 整型。产生错误的文件中的行号
N u m b e r 整型。一个标准的 C O M错误代码
S o u r c e 字符串型。引发错误的行的实际代码
3,配置“单个网页”错误处理在 I I S中“不可思议”地出现一个错误 (例如 404 Not Found)时,页面看起来像是从服务器返回给客户端的一个错误信息页面,但实际上并不是这样。它们是普通的 H T M L网页,在对一个错误进行响应时被下载并且发送给客户端。这些网页通常称为定制的错误网页 (custom error page)。
然而,错误网页作为 I I S的缺省安装部分,可根据要求定制。事实上,也可以在 I I S的早期版本中建立定制的错误网页。
在 IIS 4.0中,可以为每种不同类型的 H T T P协议或服务器错误指定一个定制的错误网页,为服务器上任意的 We b网站中的每个目录建立一个定制的错误信息网页。
第 4章 服务器进程和 A S P S e rv e r对象 计计 119下载
(1) IIS缺省的错误网页由 I I S提供的缺省错误页面放在 We b服务器的 Wi n N T \ H e l p目录中。在 Windows 2000中的
IIS 5.0的环境下,该页面放在 Wi n N T \ H e l p \ i i s h e l p \ c o m m o n目录下,如图 4 - 1 7所示。
图 4-17 缺省的错误页面位置可在浏览器中打开这些文件查看结果,或者在文本编辑器中查看 H T M L源程序和脚本代码。当一个 4 0 4错误出现时,使用的页面是 4 0 4 b,h t m,这个文件包含一个客户端脚本代码部分,
它获得当前文档的 U R L (从 d o c u m e n t对象的 u r l属性中检索 )并在该页面中显示:
120计计 ASP 3 高级编程 下载这会产生你经常看到的页面,如图 4 - 1 8所示。
图 4-18 产生 4 0 4错误时的页面
(2) IIS中错误网页的映射当 I I S检测到一个错误时,会把相应的错误页面传送给客户端。如何判别应该向客户端发送那一个页面?很明显,网页的名字应具有解决这个问题的一些信息,但事实上文件名是不重要的。错误和错误网页文件之间的映射关系是在每个目录的 p r o p e r t i e s对话框的 Custom Erro
选项卡中决定的。
在 Internet Services Manager中,在想编辑映射关系的目录上单击右键,并选择 P r o p e r t i e s。
如果对示例文件进行设置,在 C h a p t e r 0 4目录中选择 s e r v e r子目录,如图 4 - 1 9所示。
图 4-19 设置属性时的页面屏幕第 4章 服务器进程和 A S P S e rv e r对象 计计 121下载
P r o p e r t i e s对话框的 Custorn Errors选项卡在 I I S安装时 (除非已经进行过修改 )设置了缺省映射关系的列表,如图 4 - 2 0所示。
图 4-20 映射关系的列表靠近该列表的底部是 H T T P错误 5 0 0,1 0 0的一个条目。类型 5 0 0错误是由 A S P产生的,可以从中看出一些错误已经与错误网页建立了映射关系。这些错误都是一般性的错误,比如
,Invalid Application”,,Server Shutting Down”等等。然而,如果 A S P载入包含语法错误的页面,或者出现一个运行期错误,则出现 5 0 0,1 0 0错误页面。在列表中显示的缺省映射关系表明,在这个目录中的一个文件出现上述错误时,将执行 5 0 0 - 1 0 0,a s p页面。
当一个 A S P错误出现时,我们所看到的信息不再是一个普通的 We b网页,而是一个 A S P We b
网页 (也就是说它具有文件扩展名,a s p )。也可以根据需要编辑该映射关系来指向另一个页面。
(3) 指定一个定制的错误网页单击 Custom Errors选项卡中的 Edit Properties按钮,打开 Error Mapping Properties对话框。
在 Message Ty p e下拉列表中选择 U R L,键入自己的定制错误网页的完整虚拟路径,如图 4 - 2 1
所示。
图 4-21 指定错误页面的虚拟路径的屏幕
122计计 ASP 3 高级编程 下载在图 4 - 2 1中给出的值指向我们创建的与示例网页一起使用的一个定制错误网页。根据你安装示例文件的具体位置,可能要使用不同的路径。
现在无论何时出现一个 5 0 0,1 0 0类型的错误,将打开我们的定制错误页面。 M e s s a g e
Ty p e的其他两个选项是:
D e f a u l t (缺省 ):可以简单地输入一个短的文本信息,而不是指定一个发送给客户端的页面。
File(文件 ):指定一个 H T T P错误网页的物理路径。
在选择 F i l e选项时,指定的网页由 I I S载入,载入的方式与在 Windows Explorer中双击要载入的文件时的方式相同。这意味着 A S P网页不能使用这个选项,因为在这种情况下不会执行其中的任何脚本。
4,使用 G e t L a s t E r r o r方法和 A S P E r r o r对象配置好 I I S后,在编辑了错误映射属性的目录内的任一页面上出现一个与 A S P相关的错误时,都将载入定制错误页面。实际上,现在已经设置了一个正常的脚本错误陷阱,因为在这个目录内的任何一个网页上的 A S P运行期错误都将触发定制错误页面。
事实上在内部 I I S通过 S e r v e r,Tr a n s f e r方法进行这种操作,这意味着能够访问正在运行的原网页的全部环境。可以在脚本环境中获取信息,这样可以根据所出现的错误决定要做些什么。
在此基础上,可以在定制的错误网页中检索 A S P E r r o r对象,找到引起载入页面出错的错误的所有信息。
在 I I S 4,0中,编辑错误映射属性要做一些类似的工作。但是只有一般的 5 0 0错误
(,Internal Server Error” )在映射中是可用的。另外,当定制错误网页载入时,不会传送网页的环境,除了提供一个非特定的错误信息外,做其他任何工作都是比较困难的。
在以前例子中已经使用过 ASP Server Object示例页面,在其中可以看到 A S P E r r o r对象的详细情况。单击 S e r v e r,G e t L a s t E r r o r ( )对应的按钮,如图 4 - 2 2所示。
这个操作会重新载入该网页,其中的 A S P
脚本查看点击的是哪个按钮。如果是 S e r v e r.
G e t L a s t E r r o r ( )对应的名为 c m d G e t E r r o r的按钮,
将执行一些示例代码,这些代码将会产生一个运行期脚本错误。
因为已对这个目录设置了错误网页映射,
即配置为装入定制错误页面,所以当错误出现时,就打开这个页面 (通过 S e r v e r,Tr a n s f e r方法在后台不可见地工作 ),见图 4 - 2 3。
(1) 示例错误网页代码的功能第 4章 服务器进程和 A S P S e rv e r对象 计计 123下载图 4-22 查看 A S P E r r o r对象的详细情况的屏幕图 4-23 定制的错误网页定制错误网页显示 A S P E r r o r对象属性的所有值,并通过使用 R e s p o n s e,S t a t u s方法,把一个
H T T P报头状态消息返回给客户端,指明出现了一个错误。接着使用 G e t L a s t E r r o r方法获取对
A S P E r r o r对象的一个引用,因此可以访问错误的详细数据:
值得注意的一点是,如果一个脚本或 A S P错误出现在定制错误网页中,I I S将仅仅返回一个与错误代码 5 0 0,1 0 0对应的一般性消息。这可能是脚本引擎自己的错误消息,或者只是相当简单的消息:,Internal Server Error” 。不会再次重新载入定制的错误网页。
包含错误的网页的全部环境将传送给定制错误网页。也就是说,可以使用存储在任何
124计计 ASP 3 高级编程 下载
A S P内部对象集合或属性中的值。例如,如果检索来自 R e q u e s t,S e r v e r Va r i a b l e s集合的
H H T P _ R E F E R E R值,它将反映调用原网页的网页 (即在错误出现之前的网页 )的 U R L。在服务器把执行转到错误网页时,这个值不会发生变化,并且它将不包含当错误发生时正在执行的网页的 U R L。
同样,S C R I P T _ N A M E值将是包含该错误的网页的名字,而不是错误网页的 U R L。在一个错误网页已经装入时,通过检查浏览器地址栏中的 U R L,可以对此进行确认。但是在原网页的脚本变量中存储的值,在定制的错误网页中都是不可用的。
如 果 原 A S P 网 页 正 在 一 个 事 务 内 运 行,即 在 网 页 的 最 前 面 包 含 有 一 个 < % @
TRANSACTION= ".,,"%>指令,也应该确定是否需要在网页中采取一些方法,以退出该事务。
例如可以调用内置 O b j e c t C o n t e x t对象的 S e t A b o r t方法:
在本书的后面将介绍与事务的相关全部内容。
(2) 使用 A S P E r r o r对象的属性关于使用 A S P E r r o r对象的属性,有以下几点值得注意的:
即使没有出现错误,N u m b e r属性应该一直有一个值。如果 A S P网页调用 G e t L a s t E r r o r方法时没有错误出现,该属性的值是 0。通常情况下,对 A S P脚本的运行期错误,N u m b e r
属性返回十六进制的值,0 x 8 0 0 A 0 0 0 0”,加上标准的脚本引擎错误代码。例如,前面的例子对,Subscript out of Range”错误的返回值为,0 x 8 0 0 A 0 0 0 9”,因为 V B S c r i p t对该类型错误的错误代码是,9” 。
当出现已经过一个错误时,C a t e g o r y和 D e s c r i p t i o n属性将一直有一个值。
A S P C o d e属性的值由 I I S产生,对大多数脚本错误将为空。更多情况下,涉及外部组件使用出错时有相应的值。
A S P D e s c r i p t i o n属性的值由 A S P预处理程序产生,而不是由当前正在使用的脚本引擎产生的,并且对大多数脚本错误而言将是空的。更多情况下,对诸如对 A S P内置对象调用无效的方法的错误有相应的值。
F i l e,S o u r c e,L i n e和 c o l u m n属性仅在错误出现时,并且在错误的详细数据是可用的情况下才能进行设置。对一个运行期错误,F i l e和 L i n e属性通常是有效的,但是 c o l u m n属性经常返回 - 1。当错误是一个阻止页面被 A S P处理的语法错误,才返回 S o u r c e属性。一般在这些情况下,L i n e和 C o l u m n属性是有效的。如果把 S o u r c e属性的值写到页面,明智的办法是先将该值传给 H T M L E n c o d e,以防在其含有非法的 H T M L字符。在本章的后面详细将地讨论 H T M L E n c o d e方法。
4.3.5 获取 S e r v e r对象的路径信息在对存储在 We b网站上的文件进行操作时,需要获得文件的实际的物理路径,而不是使用虚拟路径或 U R L,尽管在其他网页中能用它们正常地定位文件。下一章中有一个例子,它使用
F i l e S y s t e m O b j e c t对 We b站点的 I n e t P u b \ W W W R o o t文件夹中的文件进行读写。当创建自己的定制组件或者使用商业化的组件对文件系统进行访问时,经常需要为其提供一个文件的物理路径。
S e r v e r对象的 M a p P a t h方法可以从 R e q u e s t,S e r v e r Va r i a b l e s集合中提取 H T T P报头变量,它们包含了当前文件的物理路第 4章 服务器进程和 A S P S e rv e r对象 计计 125下载径 (在 D O C U M E N T _ N A M E和 PAT H _ T R A N S L AT E D报头中)。 S e r v e r对象提供了一个方法
M a p P a t h,可以使用这个方法对我们能够提供一个有效的虚拟路径的任何文件提取相应的物理路径。可以在已经使用过的示例网页中看到使用 M a p P a t h方法,并可试验使用该方法。
如图 4 - 2 4所示,在页面的底部的 Miscellaneous Methods部分,有一个按钮执行
S e r v e r,M a p P a t h方法,并提供给它靠近该按钮的文本框中的值。在该网页的源代码中已经把这个值设置为,/ l i s h e l p / d e f a u l t,h t m”,这个文件应该自动地安装在计算机上。也可以输入另一个网页的 U R L。
图 4-24 使用 S e r v e r,M a p P a t h的屏幕单击该按钮重新装载这个网页,执行该方法并在顶部显示结果,在下部显示原页面的其余部分,如图 4 - 2 4所示。
图 4-25 显示 S e r v e r,M a p P a t h的结果
(1) 示例网页代码的功能处理这个过程的代码是与前面在相似的示例文件中已经使用过的代码十分相似。
在该页面顶部的 A S P脚本区域中,对单击的按钮的名字进行检查。在这种情况下,该按钮的名字将是 c m d M a p P a t h,简单地把相匹配的文本框中的值 t x t M a p P a t h 传送给
S e r v e r,M a p P a t h方法,并显示得到的结果:
126计计 ASP 3 高级编程 下载
(2) MapPath和虚拟应用程序目录注意,M a p P a t h方法为 / i i s h e l p / d e f a u l t,h t m文件获取的结果在 We b服务器目录外,并在主
w i n n t目录的 h e l p目录中。这清楚地证明了 M a p P a t h方法是非常有用的。
对于在缺省的 We b网站目录中的文件,其 U R L的路径部分与物理路径通常是相同的。例如,一个文件存储在 We b服务器上:
如果安装时已经在缺省目录中安装了的 We b根目录,则 U R L如下:
然而,IIS Help文件安装在缺省 We b网站根目录外的一个虚拟目录中,所以用于对其进行访问的 U R L和物理路径之间没有直接的关联。只有通过使用 S e r v e r,M a p P a t h方法才能获取真实的物理路径。
4.3.6 使用 S e r v e r对象格式化数据当前面讨论演示 S S I指令的网页的代码时,碰巧遇到了使用 H T M L的一个老问题。在一个
H T M L网页中如何显示 H T M L代码?如果“照现在的样子”使用,也就是在相应的位置上使用所有的 H T M L字符,会被浏览器当作 H T M L进行解释和执行。这样当下列内容在浏览器中显示时:
将不会显示文本 < TA B L E >,因为浏览器将其作为一个数据表的一个开始标记,并照此来执行。
为了避免这种情况,必须把在 H T M L中非法或无效的所有字符转换到等价的 H T M L字符实体
(character entity)。多数常见的字符如表 4 - 5所示。
表 4-5 字符与等价的 H T M L实体的关系字 符 等价的 H T M L实体 字 符 等价的 H T M L实体
< & l t; > & g t;
& & a m p; " & q u o t;
& c o p y;? & # 1 7 4;
所有的实体以 &号开始并以分号结束,是在一些语言中表明一个实体的标准方法的一部分,这些语言是基于 S G M L (标准化常规标识语言 )规则的,如 H T M L语言。
1,数字的 H T M L实体等价字符串注意最后一个例子,已注册的商标符号?是一个以,#”字符为前缀的数字值,而不是相应含义的一个文本缩写 (如 c o p y对应版权符号 )。具有一个大于 126 的 A N S I代码值的所有字符在 H T M L中被表示为十进制字符的 A N S I代码,以 & #为前缀,以分号为后缀。
事实上,需要留心的是使用数字实体等价字符串要优先于一些较少被支持的文本实体字符串。一个例子是商标字符 (?),该字符的实体等价字符串为 " & t r a d e ; "但不是所有浏览器 (例如 N a v i g a t o r )都能识别这个字符串,这种情况下,将在网页中显示该实体字符串。相反,使用 & # 1 5 3在所有浏览器中都能很好地工作。
2,Server对象的 H T M L E n c o d e方法把 H T M L转换为文本是进行有效显示需要的,否则 H T M L会被浏览器当成 H T M L来对待和第 4章 服务器进程和 A S P S e rv e r对象 计计 127下载执行,这意味着必须对无效的字符进行编码,使其成为等价的 H T M L实体字符串。为管理这种转换,S e r v e r对象提供了 H T M L E n c o d e方法。可以在本书提供的 ASP Server Object示例网页中练习使用这个方法。
简单地把一些文本输入到 H T M L E n c o d e对应的文本框中并单击按钮。示例中提供了一些真实的 H T M L作为缺省的文本,如图 4 - 2 6所示。
图 4-26 使用 H T M L E n c o d e方法的屏幕重新载入该页面时,在该页面的顶部显示结果。 H T M L E n c o d e方法把尖括号转换成了
,& l t;”和,& g t;”,而且把双引号转换成为,& q u o t;”,如图 4 - 2 7所示。
图 4-27 使用 H T M L E n c o d e方法 1
(1) 示例网页代码的功能关于得到的结果,有几个有趣地方。
首先,在方法名字后面的括号中已经丢掉了 < B >和 < /B>标记,相应增加了一个粗体文本部分。在网页中显示原有的值时,< B >和 < / B >被当成 H T M L提交了,所以 < B >和 < / B >标记消失了,相关内容以粗体文本显示。
可以十分容易地避免这种情况。事实上,这就是设计 H T M L E n c o d e方法的原因。原示例代码如下:
现在所能做的就是把 H T M L E n c o d e方法应用于正在输出的值上:
128计计 ASP 3 高级编程 下载现在输出了一个十分有用的结果,如图 4 - 2 8所示。
图 4-28 使用 H T M L E n c o d e方法的结果 2
现在已经解决了不提交 H T M L而显示 H T M L的问题。但是如果要在 H T M L中显示
H T M L E n c o d e方法的结果,而又不提交和处理这些结果,又会发生什么情况?为了解决这个问题,要从 H T M L E n c o d e方法本身考虑:
上面的语句在 H T M L网页中得不到同样的显示结果,这是因为 H T M L字符实体将被浏览器处理和执行,并显示为实体所替代的字符。换句话说,得到的是:
我们没看到实体。为了避免这种情况,可两次使用 S e r v e r,H T N L E n c o d e方法。这就把,&”
号变换为,& a m p ;”,这样就得到了所需的显示结果。示例网页的这个部分的代码是:
(2) HTMLEncode与 H T M L控件的缺省值从上面可以看出,如果在一个 H T M L网页中要显示 H T M L代码,而又不使之被作为 H T M L
进行处理和执行,H T N L E n c o d e方法是非常有用的。在大多数普通的 A S P网页中不大可能会遇到这种情况,除非使用包含有 H T M L的数据库或其他数据源中的数据,而又需要作为文本进行显示。
但是 H T N L E n c o d e方法真正有用的地方是,通过设置 VA L U E属性预设页面中文本类型的
H T M L控件的值。作为例子,可看一下已经用于练习 H T N L E n c o d e方法的示例网页的源程序。
创建 H T M L E n c o d e对应的文本框的 H T M L在 H T M L页中定义如下:
这是“手工编码”而不是使用 S e r v e r,H T M L E n c o d e方法。这里也只关心对双引号进行编码而不关心对尖括号的编码。为什么?这是因为如果没有这样做,该代码将被读为:
第 4章 服务器进程和 A S P S e rv e r对象 计计 129下载而在这种情况中尖括号不会带来问题,未编码的双引号则会。在文本框中替换的实际值将是 "This is <B>",即它将在第二个双引号字符处被截断。所以,在创建预置控件值的页面时,应该考虑使用 H TM L E n c o d e方法,以避免这些值被截断:
当浏览器发送已经被 H T M L编码的一个控件的值给服务器时,自动进行反向译码。即服务器使用 R e q u e s t集合中原来格式的数据。
3,格式化 U R L的数据还有另外一种情况,就是经常需要把一个文本字符串变换成能够在 We b网页中使用的另外一种格式。现代 We b服务器和操作系统都十分友好地支持包含空格字符的文件名,但是我们所使用的 U R L可能包含有空格字符,由于 H T T P使用的 U R L语法不允许有空格字符 (和几个其他字符 ),可能会出现麻烦。
另外一种更普遍的情况也会出现麻烦。当把这些值作为 Q u e r y S t r i n g集合的成员传送给服务器时,将被追加到 U R L的末尾 (在一个问号字符之后 )。这种情况发生在 < F O R M >的
M E T H O D属性被设置为,G E T” (或者是省略了 M E T H O D属性 )的情况。换句话说,对于直接追加到 U R L上的值,都可能出现麻烦。这可能发生在 < A >元素中:
一些浏览器 (例如 Internet Explorer)可以对此进行处理,因为它们在把 H T T P请求发送到服务器之前,自动地执行必要的转换。然而,许多其他的浏览器不进行这种转换,并导致了
U R L通常在第一个空格或非法字符处被截断。这样在 N a v i g a t o r中,上面给出的链接要求的网页变为 h t t p,/ / m y s e r v e r,c o m / m y p a g e,a s p? t i t l e = I n s t a n t。在服务器上,t i t l e名字 /值对的丢失部分会使代码失败。
考虑到 H T T P协议定义的限制,必须从作为 H T T P请求中的 U R L使用的字符串中删除非法的字符 (非法字符是所有那些 A N S I代码在 1 2 6之上的字符和 A N S I代码在 1 2 6以下的某些字符 )。
A N S I代码大于 1 2 6的字符必须用百分号后跟十六进制形式的 A N S I代码进行替换。这样,
版权字符 ( c )变成 % A 9。 A N S I代码在 1 2 6之下在 U R L中不合法的字符,同样使用相应的替代字符串;如表 4 - 6所示。
表 4-6 字符与 H T T P / U R L代替物的关系字 符 H T T P / U R L代替物 字 符 H T T P / U R L代替物空格 + \ % 5 C
' % 2 7 ] % 5 D
! % 2 1 ^ % 5 E
# % 2 3 ` % 6 0
$ % 2 4 { % 7 B
130计计 ASP 3 高级编程 下载
(续 )
字 符 H T T P / U R L代替物 字 符 H T T P / U R L代替物
% % 2 5 | % 7 C
& % 2 6 } % 7 D
( % 2 8 + % 2 B
) % 2 9 < % 3 C
/ % 2 F = % 3 D
,% 3 A > % 3 E; % 3 B C h r ( 1 0 ) 忽略
[ % 5 B C h r ( 1 3 ) % 0 D
4,Server对象的 U R L E n c o d e方法
S e r v e r对象提供了可以用来把任意字符串转换成相应的合法 HTTP URL的方法。可以利用示例网页对这个名为 U R L E n c o d e的方法进行练习,如图 4 - 2 9所示。
图 4-29 使用 H T M L E n c o d e方法的屏幕这里,输入的值作为 U R L是非法的,它包含了空格和 A N S I代码大于 1 2 6的字符。对这个值,使用 U R L E n c o d e方法的结果是所有的空格被替换成一个加号,版权符号被替换为 % A 9,
如图 4 - 3 0所示。
图 4-30 使用 H T M L E n c o d e方法的结果
(1) 示例网页代码的功能在示例网页中,处理这个功能的代码非常简单,仅仅检查是否单击了 U R L E n c o d e方法对应的按钮,如果单击了,把对应的文本框中的值传递给 S e r v e r,U R L E n c o d e方法并显示结果:
第 4章 服务器进程和 A S P S e rv e r对象 计计 131下载
(2) 对 H T M L元素和其他链接使用 U R L E n c o d e
U R L E n c o d e方法更普遍地用于把 < A >元素或其他链接的值写到 A S P网页。例如,如果在查询字符串中建立了一系列的链接,这些链接包含来自一个数据库的值,首先应该对这个字符串使用 S e r v e r,U R L E n c o d e方法:
如果放入字符串 s t r Va l u e的值包含标题,Active Server Pages(c)”,将得到由这个代码段创建的如下所示的 H T M L:
注意,我们不仅仅使用 S e r v e r,U R L E n c o d e方法来建立一个合法的 U R L字符串,而且还对链接的文本使用了 S e r v e r,H T M L E n c o d e方法,以确保把所有非法的字符转换为合适的 H T M L等价实体。
和 H T M L E n c o d e方法一样,不用反译码 A S P网页中的 U R L编码值。 I I S自动地实现 U R L编码字符串的转换,该字符串在 H T T P请求中转换为它们原先的格式,使得它们在内置对象中是可用的。
4.4 小结在这一章中,通过在 We b服务器上发生的处理过程,讨论了为 We b网页提供动态内容所涉及的一些问题。这些问题的一部分不是直接地与 A S P本身相关,但对这些问题的理解,将有助于理解基本的处理工作是如何进行的。
本章介绍了 I I S如何支持传统的服务器端包含指令,有一些指令可能仍然是有用的。特别是,# e x e c指令对执行系统命令以及集成原有的应用程序都是有用的。同时也讨论了一条特别的服务器端包含指令 — # i n c l u d e语句,了解了在 A S P网页内部使用这条命令的相关问题。
然而,ASP Server对象占了本章的大部分。它提供了在 A S P网页内管理服务器端处理过程的方法。在 We b服务器和 A S P的正确的环境中,它可用来创建其他对象、应用程序或组件的实例。它同时也提供了一系列的方法,这些方法允许执行其他的网页或资源,以及以正确方式格式化信息,以便在 A S P脚本和网页中使用。
S e r v e r对象也带来了一个新的 A S P内置对象,A S P E r r o r对象,它为脚本提供较好的错误处理方法。现在可以提供“正统的”脚本错误处理,并获取有关错误的信息。
132计计 ASP 3 高级编程 下载本章的主要内容是:
传统的服务器端包含 ( S S I )指令的背景和用法。
ASP 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兼容的格式转换。
现在,已完成了对 A S P内置对象的学习,在接下来的章节中将讨论如何扩充网页的功能。
利用 S e r v e r对象创建其他对象和组件的实例的能力,我们可以建立几乎能做任何事情的网页。
第 4章 服务器进程和 A S P S e rv e r对象 计计 133下载
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控件等内容。这里的动态页是专指服务器响应客户端请求而产生的页面,并且根据情况每次产生的页面可能是不同的。
举个简单的例子,创建一个只包含当前日期和时间的页面。每次请求该页面时将显示一个不同的值,因为日期和时间取决于服务器的时钟,或取决于提供日期和时间的一个资源 (例如一个独立的服务器或来自于互联网上一个标准时钟 )。当然,实际上动态页要比这复杂得多,
也许显示数据库记录的当前值或者邮件服务器上等待着的邮件消息的摘要。重要的是服务器不仅阅读一个无格式的 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下载面中所有的服务器端包含语句,结果 (如有的话 )插入到服务器的响应中,即插入到客户端接收到的页面中。
因为这些文件是映射到 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 高级编程 下载使用包含文件的另一种情况是有些内容需要按指定的时间间隔进行修改。例如,在 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下载
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 高级编程 下载表 4-1 服务器端包含指令及说明指 令 说 明
# i n c l u d e 把一个指定文件的内容插入到将被发送给客户端的响应流中并代替该指令。例如:
< ! -- # include FILE = "usefulbits.inc " -- >
这条指令把名为 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属性,可使用一个虚拟的相对或绝对路径来描述它,例如:
< ! -- #include VIRTUAL="/mysite/usefulbits.inc" -- >
< ! -- #include VIRTUAL="../../thisbit/usefulbits.inc" -- >
# c o n f i g 说明在其后的指令中将用于数据、时间和文件大小以及返回给客户端的一般性的 S S I错误信息的文本的格式。例如:
< ! -- #config ERRMSG="SSI Processing Error" -- >
设置 S S I错误信息内容为 'SSI Processing Error'。
< ! -- #config TIMEFMT = "%A,%B %d %Y %H,% M,%S" -- >
设置由其后的 S S I指令返回的日期和时间的格式。这个例子设置了一个格式风格,S a t u r d a y,
August 14 1999 10:34:50。可以用于格式字符串的标志的列表在附录 C中给出。
< ! -- #config SIZEFMT = "BYTES" -- >
设置由其后的 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环境变量的值插入到发送给客户端的响应流中并替换该指令。例如:
< ! -- #echo VAR="SERVER_NAME" -- >
写出正在执行指令到该网页的服务器的名字
# e x e c 执行一个程序或一个服务器外壳命令,例如
<!--#exec CGI="/scripts/myapp.exe? valuel= this & value2= that-->
执行名为 m y a p p,e x e的 C G I程序,允许传递查询字符串,程序在单独内存中执行。
<!--#execCMD="cmd.exe/c iisreset/stop" - ->
启动特定操作系统命令解释器 ( 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 把一个指定的文件上一次修改的日期和时间插入到发送给客户端的响应流中并代替该指令。
例如:
< ! -- #flastmod FILE="Default.asp" -- >
像 # 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 把一个指定的文件的大小插入到发送给客户端的响应流中并代替该指令。例如:
< ! -- #fsize FILE="Default.asp" -- >
象 # 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下载
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 高级编程 下载
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下载
(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”网页帐号的详细情况,该帐号应是一个具有管理员级权限的帐号。这也是 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下载因为不能匿名访问该网页。
为了能看到启动和终止服务的结果,打开 Services MMC插件”,终止 Indexing Service,如图 4 - 8所示。
图 4-8 启动和终止服务的屏幕
(2) 启动和终止 Indexing Service
单击示例 We b网页上的按钮,启动 Microsoft Indexing Service。
这个服务的短名称为 c i s v c,它通常称为 Microsoft Index Server,名称中的,c i”
字符,实际上代表,content indexer” 。
出现提示时,输入在 We b服务器上的具有管理员权限的一个帐号的用户名和口令。当该页面 ( s t a r t _ c i s v c,s t m )打开时,你将感觉到一定的延迟,这是因为 # e x e c指令载入一个窗口命令解释器 ( c m d,e x e )的实例,然后执行 net start命令。一旦服务启动 (或者如果已经在运行 ),将显示该页面的其余部分,如图 4 - 9所示。
图 4-9 输入用户名和口令后显示的界面这个页面的代码十分简单。可以看到 # e x e c指令带有 C M D属性,它设置为,cmd.exe /c net
start cisvc” 。窗体包含有重新回到前一页面的 S U B M I T按钮:
108计计 ASP 3 高级编程 下载从前一页面可以打开其他的,s t m网页,如 s t o p _ c i s v c,s t m用来再次终止该服务,不同之处仅在于使用了 net stop命令而不是 net start命令。
4.3 ASP Server对象正像在前面看到的那样,通过服务器端包含的经 I S A P I访问 We b服务器的页面,用传统的动态页面指令和命令可以做相当多的事情。但同时也有一些明显的限制。
例如,可以从 R e q u e s t,S e r v e r Va r i a b l e s集合检索到所有随同客户端的请求发送过来的 H T T P
报头的值。它几乎可以与使用 S S I # e c h o 相匹敌,同时具备的主要优点是把这些值作为字符串返回到代码中(而 # e c h o指令简单地把这些值插入到页面中),因此可以根据自己的愿望来检索和维护这些字符串。许多相同的参数应用于 # f s i z e和 # f l a s t m o d指令,使用带有 V B S c r i p t和
J S c r i p t脚本引擎中的对象的脚本,同样也可以容易地获取这个信息。在后续章节你将看到相关的细节。
# e x e c指令既非常有用,又受到一定的限制。实际上该指令仅运行系统命令或定制的 C G I
应用程序,并不能给脚本提供真正的对进程的控制。 ASP Server对象提供了一种全新的方法,
与 # e x e c指令相比,能够更安全和更容易地运行其他的应用程序或组件。当然,对于一些情况,
尤其是在确实需要执行一个操作系统命令或一个原有的 C G I应用程序的地方,# e x e c是无法替代的。
为了研究 S e r v e r对象,先概要介绍其所有可用的方法和属性,然后再进一步详细地进行讨论。
4.3.1 ASP Server对象成员概述
S e r v e r对象是专为处理服务器上的特定任务而设计的,特别是与服务器的环境和处理活动有关的任务。因此提供信息的属性只有一个,却有七种方法用来以服务器特定的方法格式化数据、管理其他网页的执行、管理外部对象和组件的执行以及处理错误。
1,Server对象的属性
S e r v e r对象的唯一一个属性用于访问一个正在执行的 A S P网页的脚本超时值,如表 4 - 2所示。
表 4-2 Server对象的属性及说明特 性 说 明
S c r i p t Ti m e o u t 整型。缺省值为 9 0。
设置或返回页面的脚本在服务器退出执行和报告一个错误之前可以执行的时间
(秒数 )。达到该值后将自动停止页面的执行,并从内存中删除包含可能进入死循环的错误的页面或者是那些长时间等待其他资源的网页。这会防止服务器因存在错误的页面而过载。对于运行时间较长的页面需要增大这个值第 4章 服务器进程和 A S P S e rv e r对象 计计 109下载
2,Server对象的方法
S e r v e r对象的方法用于格式化数据、管理网页执行和创建其他对象实例,如表 4 - 3所示。
表 4-3 Server对象的方法及说明方 法 说 明
C r e a t e O b j e c t ( "i d e n t i f i e r" ) 创建由 i d e n t i f i e r标识的对象 (一个组件、应用程序或脚本对象 )的一个实例,
返回可以在代码中使用的一个引用。可以用于一个虚拟应用程序 ( g l o b a l,a s a页 )
创建会话层或应用程序层范围内的对象。该对象可以用其 C l a s s I D来标识,如
,{ c l s i d,B D 9 6 C 5 5 6 - 6 5 A 3,,,3 7 A 9 }”或一个 P r o g I D串来标识,如
,A D O D B,C o n n e c t i o n”
E x e c u t e ( "u r l" ) 停止当前页面的执行,把控制转到在 u r l中指定的网页。用户的当前环境 (即会话状态和当前事务状态 )也传递到新的网页。在该页面执行完成后,控制传递回原先的页面,并继续执行 E x e c u t e方法后面的语句
G e t L a s t E r r o r ( ) 返回 ASP ASPError对象的一个引用,这个对象包含该页面在 A S P处理过程中发生的最近一次错误的详细数据。这些由 A S P E r r o r对象给出的信息包含文件名、行号、错误代码等等
H T M L E n c o d e ( "s t r i n g" ) 返回一个字符串,该串是输入值 s t r i n g的拷贝,但去掉了所有非法的 H T M L
字符,如 <,>,&和双引号,并转换为等价的 H T M L条目,即 & l t ;,' & g t ; '、
' & a m p ; ',' & q u o t ; '等等
M a p P a t h ( "u r l" ) 返回在 u r l中指定的文件或资源的完整物理路径和文件名
Tr a n s f e r ( "u r l" ) 停止当前页面的执行,把控制转到 u r l中指定的页面。用户的当前环境 (即会话状态和当前事务状态 )也传递到新的页面。与 E x e c u t e方法不同,当新页面执行完成时,不回到原来的页面,而是结束执行过程
U R L E n c o d e ( "s t r i n g" ) 返回一个字符串,该串是输入值 s t r i n g的拷贝,但是在 U R L中无效的所有字符,如?,&和空格,都转换为等价的 U R L条目,即 % 3 F,% 2 6和 +
4.3.2 创建其他对象的实例在前一章中,讨论了 A S P的虚拟应用程序概念,了解了虚拟应用程序通过 A p p l i c a t i o n
P r o t e c t i o n设置为 A S P网页中的组件和其他对象提供进程隔离。这沿续了第 1章的讨论,即 A S P
的 O b j e c t C o n t e x t对象如何为 A S P网页提供运行环境,以及如何使用在相同的环境中运行的其他组件和对象。
ASP Server对象提供创建这些组件和应用程序实例的功能,因此可用来扩充 A S P脚本的能力。通过实现 C r e a t e O b j e c t方法的一个特定版本来实现这个功能。
1,在 V B S c r i p t和 J s c r i p t中创建对象实例在 V B或 V B A中,可使用多种方法创建对象的实例。可以使用 N e w关键字来创建指定类型的一个新对象:
然而,不能在 A S P中用 V B S c r i p t或 J S c r i p t这么做,因为这些脚本引擎不能实现数据类型定义。不能声明一个变量为任意指定的数据类型,其变量都是 Va r i a n t s类型,或一个等价的类型
(根据使用的脚本语言而定 )。
在 V B和 V B A中另一个方法是使用 C r e a t e O b j e c t或 G e t O b j e c t方法。 C r e a t e O b j e c t方法的参数是一个 C l a s s I D (通常情况 )或一个 P r o g I D字符串,它返回相应类型的一个新对象:
110计计 ASP 3 高级编程 下载当拥有一个指定的文档类型,并且想创建一个可以处理这种文档的对象实例时,通常使用 G e t O b j e c t方法:
也可以指定所需要的对象类型和文件名,在几种对象都能处理该文档类型的情况下,这种做法是非常有用的:
V B S c r i p t支持 C r e a t e O b j e c t和 G e t O b j e c t方法。 J S c r i p t也有 g e t O b j e c t方法,与 V B s c r i p t中的
G e t O b j e c t工作方式相同。 J S c r i p t中的 A c t i v e X O b j e c t实现了与 V B S c r i p t的 C r e a t e O b j e c t方法相同的功能。但这个函数常与 J S c r i p t的 n e w运算符协同使用:
除了 V B的 N e w关键字在 V B S c r i p t和 J S c r i p t中不予支持以外,能够使用所有这些技术在一个 A S P网页中创建对象的实例。然而,能够并不意味着应该,而且大多数情况下不应该在一个 A S P网页中使用脚本引擎的对象创建函数。
2,在 A S P网页中创建对象实例为了理解一般的脚本引擎对象创建方法为什么在 A S P网页中使用效果不理想,需进一步对 A S P中的环境和 O b j e c t C o n t e x t对象进行讨论。
使用脚本引擎的一般方法在一个 A S P网页中创建一个对象实例时,该对象在当前执行的页面的环境中并未实例化。得不到 O b j e c t C o n t e x t对象的引用,所以不能使用该对象来访问页面的环境,即不能访问该页面环境中的值。
这意味着该对象不能使用内置的 A S P对象,即不能够访问在 R e q u e s t,R e s p o n s e、
A p p l i c a t i o n和 S e s s i o n对象的集合中的值,也不能使用内置的 A S P对象提供的方法和属性。该对象也不能够与此环境中任何现有的事务进行交互。如果发生错误,不能使用 O b j e c t C o n t e x t
方法放弃一个事务。
当然,你可能不想与该网页的环境进行交互。但是有其他的理由说明使用一般的对象创建方法通常是不明智的。 I I S自动地在 C O M +运行期包装程序 h l l h o s t,d l l中实例化对象,使得该对象可以在当前的虚拟应用程序中完全地共享和重新使用 (缺省的 We b网站本身是一个虚拟应用 )。
你在上一章所看到的对一个虚拟应用程序的设置,既允许在 We b服务器的内存空间中创建对象,也可以在共享的或独立的进程外 D L L H o s t,d l l实例中创建对象。如果使用一般的脚本引擎对象创建方法,将绕过所有的组件隔离和可扩展特性。而在使用 ASP Server对象的
C r e a t e O b j e c t方法时会自动地提供这些特性。
3,Server对象的 C r e a t e O b j e c t方法为了试验 C r e a t e O b j e c t方法,打开示例的 C h a p t e r 0 4主菜单页,单击,Using the ASP Server
O b j e c t”链接,如图 4 - 1 0所示。
这个链接打开一个名为 s h o w _ s e r v e r,a s p的网页,该页面可以用来试验所有的 S e r v e r对象的方法。它同时也显示 S e r v e r对象唯一的属性 S c r i p t Ti m e o u t的值、其缺省值是 9 0秒,如图 4 - 11所示。
在该页面的,Create an Instance of a Component”区域,有一个文本框,可以在其中键入想要在该网页的环境中创建的对象的 P r o g I D字符串,甚至可以键入一个 C l a s s I D数值。这里文本 框 的 缺 省 值 已 经 设 置 为 一 个 来 自 A c t i v e X 数 据 对 象 库 的 公 用 对 象 的 P r o g I D,
A D O D B,C o n n e c t i o n。
第 4章 服务器进程和 A S P S e rv e r对象 计计 111下载图 4-10 示例程序的 C h a p t e r 0 4主菜单页图 4 - 11 Server对象的属性和方法单击,S e r v e r,C r e a t e O b j e c t”选项旁的按钮,把该页面提交给其自身,因为所有的控件都在一个带有 A C T I O N属性的 < F O R M >上,而这个 A C T I O N属性被设置为这个网页的路径和文件名:
112计计 ASP 3 高级编程 下载当该页面重新载入时,该页中的一段 A S P代码 (位于 < F O R M >段的前面 )将查看提交该窗体时,单击了哪个按钮。如果是名称为,c m d C r e a t e O b j e c t”的按钮,该代码将读取文本框中的
P r o g I D字符串。为防止用户输入的 P r o g I D无效而导致执行中止,关闭缺省的脚本错误处理,
再尝试使用 S e r v e r,C r e a t e O b j e c t方法创建一个对象的实例。最后,再重新打开缺省的错误处理,
通过使用 I s O b j e c t函数检查是否创建了一个对象实例,并显示一个相应的信息:
图 4 - 1 2所示的是创建 A D O D B,C o n n e c t i o n对象的结果。可以看到该对象已被正常实例化,
已可以在代码中使用。
图 4-12 ADODB.Connection对象实例化的结果本章不讨论如何使用这些对象,你可能已经对此很熟悉了。一旦创建了对象实例,就可以像在任何其他情况中一样使用它。调用对象的方法,读取或设置属性,与使用 V B时一样;
第 4章 服务器进程和 A S P S e rv e r对象 计计 113下载或者用浏览器中客户端的 V B S c r i p t,J S C r i p t使用它。
在接下来的章节中将对对象和组件的使用进行更加详细的介绍。我们将研究由脚本引擎实现的一些对象,以及 IIS 5.0/ASP 3.0中的可安装组件,还有一些其他的免费或商用的组件,
并讨论在各种情况下如何选择相应的组件。在本书的后面,甚至会说明创建自己的能够在
A S P中使用的组件是非常简单的。
4.3.3 执行其他的网页
ASP 3.0和 IIS 5.0的新特性之一就是引入了可编程的服务器端重定向 ( s e r v e r- s i d e
r e d i r e c t i o n )的概念。这意味着,可以把一个网页的控制和执行转到另外一个网页,而不需要在客户端使用 R e s p o n s e,R e d i r e c t方法。
1,客户端重定向带来的问题
A S P编程人员通常使用 R e s p o n s e,R e d i r e c t语句把一个页面载入到当前正在执行的网页。然而,许多人没有意识到这条语句不会自动地使服务器立即装入和执行新的网页。其真正做的是把一个 H T T P重定向报头 (redirection header)增加到由 We b服务器发送给客户的输出流中。这个报头如下:
在这个报头中的标准 H T T P状态信息,302 object Moved”,告知浏览器所要求的资源已经发生移动。 L o c a t i o n报头提供相应的网页地址。当然这个地址不一定是真实的,现在正在做的事情就是“欺骗”浏览器,使浏览器认为可在另一个位置上找到所需要的网页。实际发生的是,服务器将执行所请求的网页,但是通知浏览器需要的网页已经发生移动。这就是在发送任何页面的内容到浏览器之前必须执行 R e d i r e c t方法的原因。
当一个浏览器接受到,302 object Moved”信息时,中断当前的请求并为 L o c a t i o n值中指定的网页发送一个新的请求。这与在网页的 < H E A D >段使用一个 M E TA HTTP-EQUIV标记时的工作方式相同,前面给出的 H T T P报头还可写为:
因此重定向实际上发生在客户机端,而不是在服务器上。如果在这个连接的客户端有一个代理服务器在使用的话,可能会引起显示虚假消息。代理服务器通常会截取该状态信息,
并且可能产生一个页面发送给提出原始请求的客户端。这就是在使用 R e s p o n s e,R e d i r e c t时,
,The object you requested has been moved and can be found h e r e”消息经常在客户机上显示的原因,正确地使用缓冲通常可以防止这个问题。
在 IIS 4.0或更早的版本中使用 R e s p o n s e,R e d i r e c t时,应该在 A S P网页的开头打开缓冲,然后在执行 R e s p o n s e,R e d i r e c t方法之前调用 R e s p o n s e,C l e a r。当然,在 ASP 3.0
中网页缓冲的缺省状态为打开,因此这不成问题。只要在执行该语句之前使用
R e s p o n s e,C l e a r,以前产生的输出将不会发送给客户。
2,在 ASP 3.0中服务器端的重定向在 ASP 3.0和 IIS 5.0中,在几乎所有情况下,通过使用两个新的 S e r v e r对象方法 E x e c u t e和
Tr a n s f e r,可以避免使用客户端重定向。这两个方法使控制立即转到另一个网页,该网页可以是一个 A S P网页或者是任何其他的资源,例如一个 H T T P网页、压缩文件或其他类型的文件。
114计计 ASP 3 高级编程 下载它们之间的不同之处是,E x e c u t e方法“调用”另一个的网页,与在脚本代码中调用一个子程序或函数非常相似。当另一个网页或资源已经执行完毕或传送到客户端时,控制返回到原网页中调用 E x e c u t e方法的语句的下一条语句,并继续执行。而使用 Tr a n s f e r方法时,控制不再返回到原页面中,在控制传送到的网页或资源的末尾处,执行过程停止。
当前网页的环境也传送给了目标网页或资源,因此这两个方法更有用。网页环境包含了原有的 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对象的环境。
结果是浏览器认为它仍在接收原先的页面,它并不了解服务器所做的事情。浏览器的地址栏一直显示相同的 U R L,并且 B a c k,F o r w a r d和 R e f r e s h按钮正常地工作。在使用客户端重定向时,尤其是使用 HTML META元素时,情况通常不是这样的。
传送到新的页面或资源的环境包括所有现存的事务状态 (transaction state)。当前网页的环境用 A S P的 O b j e c t C o n t e x t对象 (在第 1章中已经讨论过 )进行封装。如果需要将这个对象作为一个正在进行的事务的一部分,可以在传送控制的目的页面中使用这个对象。
(1) Server对象的 E x e c u t e和 Tr a n s f e r方法的使用在前面的示例页面中,可以试验使用 E x e c u t e和 Tr a n s f e r方法。该页面包含了在示例中已经提供的另一个文件的名字 a n o t h e r _ p a g e,a s p,它作为这两个方法的缺省参数值,如图 4 - 1 3所示。
图 4-13 使用 E x e c u t e和 Tr a n s f e r方法的屏幕单击 S e r v e r,E x e c u t e和 S e r v e r,Tr a n s f e r方法的按钮,提交到此窗体并重新装载该窗体。在这个页面顶部的脚本代码查看是哪个按钮被单击。如果是 c m d E x e c u t e或 c m d Tr a n s f e r按钮,则把当前网页的路径写入到输出流中,然后调用相应的方法,并传送与该按钮相联系的文本框中的值,然后再把当前页面的路径写到输出流中。
第 4章 服务器进程和 A S P S e rv e r对象 计计 115下载当单击 S e r v e r,E x c u t e方法的按钮时,会看到当前页面的路径,这是由上面代码中的第一条
R e s p o n s e,Wr i t e语句创建并显示的。后面接着的内容是来自被执行的网页 ( a n o t h e r _ p a g e,a s p )的一些输出内容。在这之后是第二个 R e s p o n s e,Wr i t e语句的输出内容,这表明控制又回到了原先的网页。屏幕如图 4 - 1 4所示。
图 4-14 Server,E x c u t e方法的演示页面的两条水平线之间的段落 (显示当前执行的网页为 s h o w _ s e r v e r,a s p )来自原先的网页。
在接下来的段落来自被执行的网页 a n o t h e r _ p a g e,a s p。下面是该页面的完整代码:
116计计 ASP 3 高级编程 下载注意,该页面执行时,不能使用 R e q u e s t,S e r v e r Va r i a b l e s ( " S C R I P T _ N A M E " )获取它的路径,
因为环境仍然是原网页的。我们不得不把页面名作为文本写入,因为实在没有办法可以从
A S P环境中直接获取。
这里包括了一个返回前一个网页的按钮的原因是,通过在主网页中单击相对应的按钮,
可以使用 S e r v e r,Tr a n s f e r方法调用这个页面。这次看到了完全相同的输出,只是没有第二次路径输出,因为是“传送”这个页面而不是“执行”该页面,所以控制不会回传给原先的网页,
如图 4 - 1 5所示。
图 4-15 Server,t r a n s f e r的演示
(2) 从 A S P执行 S S I网页目前有了一个方法,如果需要的话可在 A S P网页中成功地使用 S S I指令。虽然这种要求不常出现,但可实现。过去的问题是,由于在 S S I网页 (文件扩展名是,s t m,,s h t m l和,s h t m )中不能包含 A S P代码,所以程序不能“无缝”地重定向回到原先的网页,必须增加一个按钮或链接,
以装载原先的或另外的 A S P网页。
现在,由于有了 S e r v e r,E x e c u t e方法,可以执行一个 S S I网页并且将控制自动返回到原先的网页,客户端意识不到这些过程正在进行。客户端只是看到原先的 A S P网页和执行结果。来自于 S S I网页的任何输出都“无缝”地插入到流中。当然,如果在 S S I网页完成后,不想使原先的网页继续执行,可以使用 S e r v e r,Tr a n s f e r方法。
为了看到这个技术的执行,把前面使用过的 C G I - S S I例子网页的虚拟路径输入到
S e r v e r,E x c u t e方法 (或 S e r v e r,Tr a n s f e r方法 )的文本框中。这个路径是,.,/ s s i _ c g i / s s i _ c g i,s t m” 。
在单击按钮对 E x e c u t e或 Tr a n s f e r方法进行调用以后,将看到,s t m网页已经执行,其中有 S S I指令的结果。在来自 s s i _ c g i,s t m的内容之后出现的是原先的网页的其余部分,虽然在图 4 - 1 6中看不到,但可通过滚动条看到该内容。
第 4章 服务器进程和 A S P S e rv e r对象 计计 117下载图 4-16 执行 S e r v e r,E x c u t e方法后的屏幕
3,SSI #exec 指令的不足遗憾的是 E x e c u t e和 Tr a n s f e r方法一般不能与 S S I的 # e x e c指令一起工作,因为包含这个指令的,s t m网页会在调用它的 A S P网页的环境中运行。在大多数情况下,它需要运行于直接引用该网页的一个独立的环境中。
存在这样的限制真是遗憾,如果没有这种限制,我们通过 S e r v e r,E x e c u t e执行的网页可以
“不可见地”包含来自于 A S P网页的 # e x e c指令。对前面的通过 net stop和 net start命令停止和启动 Indexing Service的示例来说,这可能是一种理想的解决方案。
但是,我们必须求助于老的和已经验证的方法。当用户单击一个按钮时,简单地使用
R e s p o n s e,R e d i r e c t方法来打开相关的网页:
可以试着把使用 # e x e c指令的一个 S S I网页的虚拟路径输入到示例页面的 S e r v e r,E x e c u t e和
S e r v e r,Tr a n s f e r方法的文本框中。前面使用过的 # e x e c示例的虚拟路径是,.,/ s s i _ c g i / e x e c
/ s t a r t _ c i s v c,s t m”和,.,/ s s i _ c g i / e x e c / s t o p _ c i s v c,s t m” 。
4.3.4 Server对象的错误处理
A S P没有错误处理机制一直受到批评。
118计计 ASP 3 高级编程 下载在 V B S c r i p t中,有一个 On Error Resume Next语句,它使脚本解释器忽略运行期错误并继续脚本代码的执行。接着该脚本可以检查 E r r,N u m b e r属性的值,判别是否出现了错误。如果出现错误,返回一个非零值。在 ASP 3.0中,也可以使用 On Error Goto 0“转回到”缺省的错误处理。在 ASP 2.0中实际也进行这种处理,但是没有相应文档说明。
在 J S c r i p t中,有一个新的错误处理功能,C语言风格的 t r y和 c a t c h语句。然而所有的这些错误处理技术都不是由 A S P或 I I S实现的,而是由 A S P使用的脚本引擎实现的。
第 7章专门讨论脚本和脚本引擎涉及到的调试和错误处理技术。
同时,A S P和 I I S的开发小组已经增加了一个新的功能,用于在 A S P网页中进行错误处理。
这分为两个部分,I I S错误页面的配置及使用 A S P的一个新的方法和对象。
1,Server对象的 G e t L a s t E r r o r方法在 ASP 3.0中,S e r v e r对象有一个名为 G e t L a s t E r r o r的新方法。与 V B S c r i p t的 E r r对象不同,
不能为查看是否出现了错误而随时调用该方法,只能在一个 A S P定制的错误网页中使用。如果像对 E r r对象进行操作那样,通过关闭缺省的错误处理 (用 On Error Resume Next语句 )来使用,
则 G e t L a s t E r r o r方法不能访问错误的详细数据。
G e t L a s t E r r o r方法要做的事情是提供更多的有关错误源和错误原因的信息。 G e t L a s t E r r o r
方法创建并返回一个对象的引用,该对象是一个名为 A S P E r r o r的新对象。这个对象具有一系列的属性,这些属性返回有关在 G e t L a s t E r r o r方法调用之前出现的最新错误的信息。
2,ASPError对象的属性
A S P E r r o r对象提供了九个属性说明所出现的错误的性质和错误源,并返回引发错误的实际代码,其属性及说明如表 4 - 4所示。
表 4-4 ASPError对象的属性及说明属 性 说 明
A S P C o d e 整型。由 A S P / I I S产生的错误号,例如 0 x 8 0 0 A 0 0 0 9
A S P D e s c r i p t i o n 字符串型。如果这个错误是与 A S P 相关的错误,这个属性是错误的详细说明
C a t e g o r y 字符串型。错误源,即 A S P内部脚本语言、或一个对象
C o l u m n 整型。产生错误的文件中的字符位置
D e s c r i p t i o n 字符串型。错误的简短说明
F i l e 字符串型。错误出现时正在处理的文件的名称
L i n e 整型。产生错误的文件中的行号
N u m b e r 整型。一个标准的 C O M错误代码
S o u r c e 字符串型。引发错误的行的实际代码
3,配置“单个网页”错误处理在 I I S中“不可思议”地出现一个错误 (例如 404 Not Found)时,页面看起来像是从服务器返回给客户端的一个错误信息页面,但实际上并不是这样。它们是普通的 H T M L网页,在对一个错误进行响应时被下载并且发送给客户端。这些网页通常称为定制的错误网页 (custom error page)。
然而,错误网页作为 I I S的缺省安装部分,可根据要求定制。事实上,也可以在 I I S的早期版本中建立定制的错误网页。
在 IIS 4.0中,可以为每种不同类型的 H T T P协议或服务器错误指定一个定制的错误网页,为服务器上任意的 We b网站中的每个目录建立一个定制的错误信息网页。
第 4章 服务器进程和 A S P S e rv e r对象 计计 119下载
(1) IIS缺省的错误网页由 I I S提供的缺省错误页面放在 We b服务器的 Wi n N T \ H e l p目录中。在 Windows 2000中的
IIS 5.0的环境下,该页面放在 Wi n N T \ H e l p \ i i s h e l p \ c o m m o n目录下,如图 4 - 1 7所示。
图 4-17 缺省的错误页面位置可在浏览器中打开这些文件查看结果,或者在文本编辑器中查看 H T M L源程序和脚本代码。当一个 4 0 4错误出现时,使用的页面是 4 0 4 b,h t m,这个文件包含一个客户端脚本代码部分,
它获得当前文档的 U R L (从 d o c u m e n t对象的 u r l属性中检索 )并在该页面中显示:
120计计 ASP 3 高级编程 下载这会产生你经常看到的页面,如图 4 - 1 8所示。
图 4-18 产生 4 0 4错误时的页面
(2) IIS中错误网页的映射当 I I S检测到一个错误时,会把相应的错误页面传送给客户端。如何判别应该向客户端发送那一个页面?很明显,网页的名字应具有解决这个问题的一些信息,但事实上文件名是不重要的。错误和错误网页文件之间的映射关系是在每个目录的 p r o p e r t i e s对话框的 Custom Erro
选项卡中决定的。
在 Internet Services Manager中,在想编辑映射关系的目录上单击右键,并选择 P r o p e r t i e s。
如果对示例文件进行设置,在 C h a p t e r 0 4目录中选择 s e r v e r子目录,如图 4 - 1 9所示。
图 4-19 设置属性时的页面屏幕第 4章 服务器进程和 A S P S e rv e r对象 计计 121下载
P r o p e r t i e s对话框的 Custorn Errors选项卡在 I I S安装时 (除非已经进行过修改 )设置了缺省映射关系的列表,如图 4 - 2 0所示。
图 4-20 映射关系的列表靠近该列表的底部是 H T T P错误 5 0 0,1 0 0的一个条目。类型 5 0 0错误是由 A S P产生的,可以从中看出一些错误已经与错误网页建立了映射关系。这些错误都是一般性的错误,比如
,Invalid Application”,,Server Shutting Down”等等。然而,如果 A S P载入包含语法错误的页面,或者出现一个运行期错误,则出现 5 0 0,1 0 0错误页面。在列表中显示的缺省映射关系表明,在这个目录中的一个文件出现上述错误时,将执行 5 0 0 - 1 0 0,a s p页面。
当一个 A S P错误出现时,我们所看到的信息不再是一个普通的 We b网页,而是一个 A S P We b
网页 (也就是说它具有文件扩展名,a s p )。也可以根据需要编辑该映射关系来指向另一个页面。
(3) 指定一个定制的错误网页单击 Custom Errors选项卡中的 Edit Properties按钮,打开 Error Mapping Properties对话框。
在 Message Ty p e下拉列表中选择 U R L,键入自己的定制错误网页的完整虚拟路径,如图 4 - 2 1
所示。
图 4-21 指定错误页面的虚拟路径的屏幕
122计计 ASP 3 高级编程 下载在图 4 - 2 1中给出的值指向我们创建的与示例网页一起使用的一个定制错误网页。根据你安装示例文件的具体位置,可能要使用不同的路径。
现在无论何时出现一个 5 0 0,1 0 0类型的错误,将打开我们的定制错误页面。 M e s s a g e
Ty p e的其他两个选项是:
D e f a u l t (缺省 ):可以简单地输入一个短的文本信息,而不是指定一个发送给客户端的页面。
File(文件 ):指定一个 H T T P错误网页的物理路径。
在选择 F i l e选项时,指定的网页由 I I S载入,载入的方式与在 Windows Explorer中双击要载入的文件时的方式相同。这意味着 A S P网页不能使用这个选项,因为在这种情况下不会执行其中的任何脚本。
4,使用 G e t L a s t E r r o r方法和 A S P E r r o r对象配置好 I I S后,在编辑了错误映射属性的目录内的任一页面上出现一个与 A S P相关的错误时,都将载入定制错误页面。实际上,现在已经设置了一个正常的脚本错误陷阱,因为在这个目录内的任何一个网页上的 A S P运行期错误都将触发定制错误页面。
事实上在内部 I I S通过 S e r v e r,Tr a n s f e r方法进行这种操作,这意味着能够访问正在运行的原网页的全部环境。可以在脚本环境中获取信息,这样可以根据所出现的错误决定要做些什么。
在此基础上,可以在定制的错误网页中检索 A S P E r r o r对象,找到引起载入页面出错的错误的所有信息。
在 I I S 4,0中,编辑错误映射属性要做一些类似的工作。但是只有一般的 5 0 0错误
(,Internal Server Error” )在映射中是可用的。另外,当定制错误网页载入时,不会传送网页的环境,除了提供一个非特定的错误信息外,做其他任何工作都是比较困难的。
在以前例子中已经使用过 ASP Server Object示例页面,在其中可以看到 A S P E r r o r对象的详细情况。单击 S e r v e r,G e t L a s t E r r o r ( )对应的按钮,如图 4 - 2 2所示。
这个操作会重新载入该网页,其中的 A S P
脚本查看点击的是哪个按钮。如果是 S e r v e r.
G e t L a s t E r r o r ( )对应的名为 c m d G e t E r r o r的按钮,
将执行一些示例代码,这些代码将会产生一个运行期脚本错误。
因为已对这个目录设置了错误网页映射,
即配置为装入定制错误页面,所以当错误出现时,就打开这个页面 (通过 S e r v e r,Tr a n s f e r方法在后台不可见地工作 ),见图 4 - 2 3。
(1) 示例错误网页代码的功能第 4章 服务器进程和 A S P S e rv e r对象 计计 123下载图 4-22 查看 A S P E r r o r对象的详细情况的屏幕图 4-23 定制的错误网页定制错误网页显示 A S P E r r o r对象属性的所有值,并通过使用 R e s p o n s e,S t a t u s方法,把一个
H T T P报头状态消息返回给客户端,指明出现了一个错误。接着使用 G e t L a s t E r r o r方法获取对
A S P E r r o r对象的一个引用,因此可以访问错误的详细数据:
值得注意的一点是,如果一个脚本或 A S P错误出现在定制错误网页中,I I S将仅仅返回一个与错误代码 5 0 0,1 0 0对应的一般性消息。这可能是脚本引擎自己的错误消息,或者只是相当简单的消息:,Internal Server Error” 。不会再次重新载入定制的错误网页。
包含错误的网页的全部环境将传送给定制错误网页。也就是说,可以使用存储在任何
124计计 ASP 3 高级编程 下载
A S P内部对象集合或属性中的值。例如,如果检索来自 R e q u e s t,S e r v e r Va r i a b l e s集合的
H H T P _ R E F E R E R值,它将反映调用原网页的网页 (即在错误出现之前的网页 )的 U R L。在服务器把执行转到错误网页时,这个值不会发生变化,并且它将不包含当错误发生时正在执行的网页的 U R L。
同样,S C R I P T _ N A M E值将是包含该错误的网页的名字,而不是错误网页的 U R L。在一个错误网页已经装入时,通过检查浏览器地址栏中的 U R L,可以对此进行确认。但是在原网页的脚本变量中存储的值,在定制的错误网页中都是不可用的。
如 果 原 A S P 网 页 正 在 一 个 事 务 内 运 行,即 在 网 页 的 最 前 面 包 含 有 一 个 < % @
TRANSACTION= ".,,"%>指令,也应该确定是否需要在网页中采取一些方法,以退出该事务。
例如可以调用内置 O b j e c t C o n t e x t对象的 S e t A b o r t方法:
在本书的后面将介绍与事务的相关全部内容。
(2) 使用 A S P E r r o r对象的属性关于使用 A S P E r r o r对象的属性,有以下几点值得注意的:
即使没有出现错误,N u m b e r属性应该一直有一个值。如果 A S P网页调用 G e t L a s t E r r o r方法时没有错误出现,该属性的值是 0。通常情况下,对 A S P脚本的运行期错误,N u m b e r
属性返回十六进制的值,0 x 8 0 0 A 0 0 0 0”,加上标准的脚本引擎错误代码。例如,前面的例子对,Subscript out of Range”错误的返回值为,0 x 8 0 0 A 0 0 0 9”,因为 V B S c r i p t对该类型错误的错误代码是,9” 。
当出现已经过一个错误时,C a t e g o r y和 D e s c r i p t i o n属性将一直有一个值。
A S P C o d e属性的值由 I I S产生,对大多数脚本错误将为空。更多情况下,涉及外部组件使用出错时有相应的值。
A S P D e s c r i p t i o n属性的值由 A S P预处理程序产生,而不是由当前正在使用的脚本引擎产生的,并且对大多数脚本错误而言将是空的。更多情况下,对诸如对 A S P内置对象调用无效的方法的错误有相应的值。
F i l e,S o u r c e,L i n e和 c o l u m n属性仅在错误出现时,并且在错误的详细数据是可用的情况下才能进行设置。对一个运行期错误,F i l e和 L i n e属性通常是有效的,但是 c o l u m n属性经常返回 - 1。当错误是一个阻止页面被 A S P处理的语法错误,才返回 S o u r c e属性。一般在这些情况下,L i n e和 C o l u m n属性是有效的。如果把 S o u r c e属性的值写到页面,明智的办法是先将该值传给 H T M L E n c o d e,以防在其含有非法的 H T M L字符。在本章的后面详细将地讨论 H T M L E n c o d e方法。
4.3.5 获取 S e r v e r对象的路径信息在对存储在 We b网站上的文件进行操作时,需要获得文件的实际的物理路径,而不是使用虚拟路径或 U R L,尽管在其他网页中能用它们正常地定位文件。下一章中有一个例子,它使用
F i l e S y s t e m O b j e c t对 We b站点的 I n e t P u b \ W W W R o o t文件夹中的文件进行读写。当创建自己的定制组件或者使用商业化的组件对文件系统进行访问时,经常需要为其提供一个文件的物理路径。
S e r v e r对象的 M a p P a t h方法可以从 R e q u e s t,S e r v e r Va r i a b l e s集合中提取 H T T P报头变量,它们包含了当前文件的物理路第 4章 服务器进程和 A S P S e rv e r对象 计计 125下载径 (在 D O C U M E N T _ N A M E和 PAT H _ T R A N S L AT E D报头中)。 S e r v e r对象提供了一个方法
M a p P a t h,可以使用这个方法对我们能够提供一个有效的虚拟路径的任何文件提取相应的物理路径。可以在已经使用过的示例网页中看到使用 M a p P a t h方法,并可试验使用该方法。
如图 4 - 2 4所示,在页面的底部的 Miscellaneous Methods部分,有一个按钮执行
S e r v e r,M a p P a t h方法,并提供给它靠近该按钮的文本框中的值。在该网页的源代码中已经把这个值设置为,/ l i s h e l p / d e f a u l t,h t m”,这个文件应该自动地安装在计算机上。也可以输入另一个网页的 U R L。
图 4-24 使用 S e r v e r,M a p P a t h的屏幕单击该按钮重新装载这个网页,执行该方法并在顶部显示结果,在下部显示原页面的其余部分,如图 4 - 2 4所示。
图 4-25 显示 S e r v e r,M a p P a t h的结果
(1) 示例网页代码的功能处理这个过程的代码是与前面在相似的示例文件中已经使用过的代码十分相似。
在该页面顶部的 A S P脚本区域中,对单击的按钮的名字进行检查。在这种情况下,该按钮的名字将是 c m d M a p P a t h,简单地把相匹配的文本框中的值 t x t M a p P a t h 传送给
S e r v e r,M a p P a t h方法,并显示得到的结果:
126计计 ASP 3 高级编程 下载
(2) MapPath和虚拟应用程序目录注意,M a p P a t h方法为 / i i s h e l p / d e f a u l t,h t m文件获取的结果在 We b服务器目录外,并在主
w i n n t目录的 h e l p目录中。这清楚地证明了 M a p P a t h方法是非常有用的。
对于在缺省的 We b网站目录中的文件,其 U R L的路径部分与物理路径通常是相同的。例如,一个文件存储在 We b服务器上:
如果安装时已经在缺省目录中安装了的 We b根目录,则 U R L如下:
然而,IIS Help文件安装在缺省 We b网站根目录外的一个虚拟目录中,所以用于对其进行访问的 U R L和物理路径之间没有直接的关联。只有通过使用 S e r v e r,M a p P a t h方法才能获取真实的物理路径。
4.3.6 使用 S e r v e r对象格式化数据当前面讨论演示 S S I指令的网页的代码时,碰巧遇到了使用 H T M L的一个老问题。在一个
H T M L网页中如何显示 H T M L代码?如果“照现在的样子”使用,也就是在相应的位置上使用所有的 H T M L字符,会被浏览器当作 H T M L进行解释和执行。这样当下列内容在浏览器中显示时:
将不会显示文本 < TA B L E >,因为浏览器将其作为一个数据表的一个开始标记,并照此来执行。
为了避免这种情况,必须把在 H T M L中非法或无效的所有字符转换到等价的 H T M L字符实体
(character entity)。多数常见的字符如表 4 - 5所示。
表 4-5 字符与等价的 H T M L实体的关系字 符 等价的 H T M L实体 字 符 等价的 H T M L实体
< & l t; > & g t;
& & a m p; " & q u o t;
& c o p y;? & # 1 7 4;
所有的实体以 &号开始并以分号结束,是在一些语言中表明一个实体的标准方法的一部分,这些语言是基于 S G M L (标准化常规标识语言 )规则的,如 H T M L语言。
1,数字的 H T M L实体等价字符串注意最后一个例子,已注册的商标符号?是一个以,#”字符为前缀的数字值,而不是相应含义的一个文本缩写 (如 c o p y对应版权符号 )。具有一个大于 126 的 A N S I代码值的所有字符在 H T M L中被表示为十进制字符的 A N S I代码,以 & #为前缀,以分号为后缀。
事实上,需要留心的是使用数字实体等价字符串要优先于一些较少被支持的文本实体字符串。一个例子是商标字符 (?),该字符的实体等价字符串为 " & t r a d e ; "但不是所有浏览器 (例如 N a v i g a t o r )都能识别这个字符串,这种情况下,将在网页中显示该实体字符串。相反,使用 & # 1 5 3在所有浏览器中都能很好地工作。
2,Server对象的 H T M L E n c o d e方法把 H T M L转换为文本是进行有效显示需要的,否则 H T M L会被浏览器当成 H T M L来对待和第 4章 服务器进程和 A S P S e rv e r对象 计计 127下载执行,这意味着必须对无效的字符进行编码,使其成为等价的 H T M L实体字符串。为管理这种转换,S e r v e r对象提供了 H T M L E n c o d e方法。可以在本书提供的 ASP Server Object示例网页中练习使用这个方法。
简单地把一些文本输入到 H T M L E n c o d e对应的文本框中并单击按钮。示例中提供了一些真实的 H T M L作为缺省的文本,如图 4 - 2 6所示。
图 4-26 使用 H T M L E n c o d e方法的屏幕重新载入该页面时,在该页面的顶部显示结果。 H T M L E n c o d e方法把尖括号转换成了
,& l t;”和,& g t;”,而且把双引号转换成为,& q u o t;”,如图 4 - 2 7所示。
图 4-27 使用 H T M L E n c o d e方法 1
(1) 示例网页代码的功能关于得到的结果,有几个有趣地方。
首先,在方法名字后面的括号中已经丢掉了 < B >和 < /B>标记,相应增加了一个粗体文本部分。在网页中显示原有的值时,< B >和 < / B >被当成 H T M L提交了,所以 < B >和 < / B >标记消失了,相关内容以粗体文本显示。
可以十分容易地避免这种情况。事实上,这就是设计 H T M L E n c o d e方法的原因。原示例代码如下:
现在所能做的就是把 H T M L E n c o d e方法应用于正在输出的值上:
128计计 ASP 3 高级编程 下载现在输出了一个十分有用的结果,如图 4 - 2 8所示。
图 4-28 使用 H T M L E n c o d e方法的结果 2
现在已经解决了不提交 H T M L而显示 H T M L的问题。但是如果要在 H T M L中显示
H T M L E n c o d e方法的结果,而又不提交和处理这些结果,又会发生什么情况?为了解决这个问题,要从 H T M L E n c o d e方法本身考虑:
上面的语句在 H T M L网页中得不到同样的显示结果,这是因为 H T M L字符实体将被浏览器处理和执行,并显示为实体所替代的字符。换句话说,得到的是:
我们没看到实体。为了避免这种情况,可两次使用 S e r v e r,H T N L E n c o d e方法。这就把,&”
号变换为,& a m p ;”,这样就得到了所需的显示结果。示例网页的这个部分的代码是:
(2) HTMLEncode与 H T M L控件的缺省值从上面可以看出,如果在一个 H T M L网页中要显示 H T M L代码,而又不使之被作为 H T M L
进行处理和执行,H T N L E n c o d e方法是非常有用的。在大多数普通的 A S P网页中不大可能会遇到这种情况,除非使用包含有 H T M L的数据库或其他数据源中的数据,而又需要作为文本进行显示。
但是 H T N L E n c o d e方法真正有用的地方是,通过设置 VA L U E属性预设页面中文本类型的
H T M L控件的值。作为例子,可看一下已经用于练习 H T N L E n c o d e方法的示例网页的源程序。
创建 H T M L E n c o d e对应的文本框的 H T M L在 H T M L页中定义如下:
这是“手工编码”而不是使用 S e r v e r,H T M L E n c o d e方法。这里也只关心对双引号进行编码而不关心对尖括号的编码。为什么?这是因为如果没有这样做,该代码将被读为:
第 4章 服务器进程和 A S P S e rv e r对象 计计 129下载而在这种情况中尖括号不会带来问题,未编码的双引号则会。在文本框中替换的实际值将是 "This is <B>",即它将在第二个双引号字符处被截断。所以,在创建预置控件值的页面时,应该考虑使用 H TM L E n c o d e方法,以避免这些值被截断:
当浏览器发送已经被 H T M L编码的一个控件的值给服务器时,自动进行反向译码。即服务器使用 R e q u e s t集合中原来格式的数据。
3,格式化 U R L的数据还有另外一种情况,就是经常需要把一个文本字符串变换成能够在 We b网页中使用的另外一种格式。现代 We b服务器和操作系统都十分友好地支持包含空格字符的文件名,但是我们所使用的 U R L可能包含有空格字符,由于 H T T P使用的 U R L语法不允许有空格字符 (和几个其他字符 ),可能会出现麻烦。
另外一种更普遍的情况也会出现麻烦。当把这些值作为 Q u e r y S t r i n g集合的成员传送给服务器时,将被追加到 U R L的末尾 (在一个问号字符之后 )。这种情况发生在 < F O R M >的
M E T H O D属性被设置为,G E T” (或者是省略了 M E T H O D属性 )的情况。换句话说,对于直接追加到 U R L上的值,都可能出现麻烦。这可能发生在 < A >元素中:
一些浏览器 (例如 Internet Explorer)可以对此进行处理,因为它们在把 H T T P请求发送到服务器之前,自动地执行必要的转换。然而,许多其他的浏览器不进行这种转换,并导致了
U R L通常在第一个空格或非法字符处被截断。这样在 N a v i g a t o r中,上面给出的链接要求的网页变为 h t t p,/ / m y s e r v e r,c o m / m y p a g e,a s p? t i t l e = I n s t a n t。在服务器上,t i t l e名字 /值对的丢失部分会使代码失败。
考虑到 H T T P协议定义的限制,必须从作为 H T T P请求中的 U R L使用的字符串中删除非法的字符 (非法字符是所有那些 A N S I代码在 1 2 6之上的字符和 A N S I代码在 1 2 6以下的某些字符 )。
A N S I代码大于 1 2 6的字符必须用百分号后跟十六进制形式的 A N S I代码进行替换。这样,
版权字符 ( c )变成 % A 9。 A N S I代码在 1 2 6之下在 U R L中不合法的字符,同样使用相应的替代字符串;如表 4 - 6所示。
表 4-6 字符与 H T T P / U R L代替物的关系字 符 H T T P / U R L代替物 字 符 H T T P / U R L代替物空格 + \ % 5 C
' % 2 7 ] % 5 D
! % 2 1 ^ % 5 E
# % 2 3 ` % 6 0
$ % 2 4 { % 7 B
130计计 ASP 3 高级编程 下载
(续 )
字 符 H T T P / U R L代替物 字 符 H T T P / U R L代替物
% % 2 5 | % 7 C
& % 2 6 } % 7 D
( % 2 8 + % 2 B
) % 2 9 < % 3 C
/ % 2 F = % 3 D
,% 3 A > % 3 E; % 3 B C h r ( 1 0 ) 忽略
[ % 5 B C h r ( 1 3 ) % 0 D
4,Server对象的 U R L E n c o d e方法
S e r v e r对象提供了可以用来把任意字符串转换成相应的合法 HTTP URL的方法。可以利用示例网页对这个名为 U R L E n c o d e的方法进行练习,如图 4 - 2 9所示。
图 4-29 使用 H T M L E n c o d e方法的屏幕这里,输入的值作为 U R L是非法的,它包含了空格和 A N S I代码大于 1 2 6的字符。对这个值,使用 U R L E n c o d e方法的结果是所有的空格被替换成一个加号,版权符号被替换为 % A 9,
如图 4 - 3 0所示。
图 4-30 使用 H T M L E n c o d e方法的结果
(1) 示例网页代码的功能在示例网页中,处理这个功能的代码非常简单,仅仅检查是否单击了 U R L E n c o d e方法对应的按钮,如果单击了,把对应的文本框中的值传递给 S e r v e r,U R L E n c o d e方法并显示结果:
第 4章 服务器进程和 A S P S e rv e r对象 计计 131下载
(2) 对 H T M L元素和其他链接使用 U R L E n c o d e
U R L E n c o d e方法更普遍地用于把 < A >元素或其他链接的值写到 A S P网页。例如,如果在查询字符串中建立了一系列的链接,这些链接包含来自一个数据库的值,首先应该对这个字符串使用 S e r v e r,U R L E n c o d e方法:
如果放入字符串 s t r Va l u e的值包含标题,Active Server Pages(c)”,将得到由这个代码段创建的如下所示的 H T M L:
注意,我们不仅仅使用 S e r v e r,U R L E n c o d e方法来建立一个合法的 U R L字符串,而且还对链接的文本使用了 S e r v e r,H T M L E n c o d e方法,以确保把所有非法的字符转换为合适的 H T M L等价实体。
和 H T M L E n c o d e方法一样,不用反译码 A S P网页中的 U R L编码值。 I I S自动地实现 U R L编码字符串的转换,该字符串在 H T T P请求中转换为它们原先的格式,使得它们在内置对象中是可用的。
4.4 小结在这一章中,通过在 We b服务器上发生的处理过程,讨论了为 We b网页提供动态内容所涉及的一些问题。这些问题的一部分不是直接地与 A S P本身相关,但对这些问题的理解,将有助于理解基本的处理工作是如何进行的。
本章介绍了 I I S如何支持传统的服务器端包含指令,有一些指令可能仍然是有用的。特别是,# e x e c指令对执行系统命令以及集成原有的应用程序都是有用的。同时也讨论了一条特别的服务器端包含指令 — # i n c l u d e语句,了解了在 A S P网页内部使用这条命令的相关问题。
然而,ASP Server对象占了本章的大部分。它提供了在 A S P网页内管理服务器端处理过程的方法。在 We b服务器和 A S P的正确的环境中,它可用来创建其他对象、应用程序或组件的实例。它同时也提供了一系列的方法,这些方法允许执行其他的网页或资源,以及以正确方式格式化信息,以便在 A S P脚本和网页中使用。
S e r v e r对象也带来了一个新的 A S P内置对象,A S P E r r o r对象,它为脚本提供较好的错误处理方法。现在可以提供“正统的”脚本错误处理,并获取有关错误的信息。
132计计 ASP 3 高级编程 下载本章的主要内容是:
传统的服务器端包含 ( S S I )指令的背景和用法。
ASP 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兼容的格式转换。
现在,已完成了对 A S P内置对象的学习,在接下来的章节中将讨论如何扩充网页的功能。
利用 S e r v e r对象创建其他对象和组件的实例的能力,我们可以建立几乎能做任何事情的网页。
第 4章 服务器进程和 A S P S e rv e r对象 计计 133下载