




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4 服務(wù)器進(jìn)程和ASPServer對前面的章節(jié)已經(jīng)研究了ASP的一些內(nèi)置對象。重點(diǎn)介紹的對象有Request、Response、Session和Application對象。ASP中另一個(gè)比較主要的對象為Server對象。本章重點(diǎn)介紹這個(gè)對象的背景知識和使用方法。Server對象在服務(wù)器端中通過實(shí)例和使用其他外部對象和組件,提供了一種擴(kuò)展ASP頁的功能的方法。事實(shí)上,許多人認(rèn)為這個(gè)對象是ASP之所以能夠流行的主要因素。引入Server對象的意義很大,這意味著ASP不必提供人們所需要的所有屬性。它可調(diào)用其他應(yīng)用程序和組件完成指定工作。這也恰好符合了構(gòu)建由獨(dú)立的對象組成的應(yīng)用程序的總體目標(biāo),而不是構(gòu)建通常見到的那種耗盡硬盤空間的“可做每件事情”的巨型程序。不僅僅是在計(jì)算機(jī)的世界中,整個(gè)世界正在朝著組件和“即插即用”概念方面發(fā)展。如今,當(dāng)汽車或電視機(jī)發(fā)生故障時(shí),或工很可能會拔出有問題的部件并且插上一個(gè)新的部件,因此,汽車人員或電視機(jī)維修人員的工作也變成了面向?qū)ο蟮?。IIS同樣支持使用外部對象和與服務(wù)器環(huán)境進(jìn)行交互作用的許多傳統(tǒng)方法。這是一個(gè)特定的例外,這些方法并不是真正的ASP組成部分,但通常的確非常有用,并且通過ServeASP很好地進(jìn)行了集成。本章將簡要地回顧這些傳統(tǒng)方法,然后詳細(xì)地介紹ASPServer傳統(tǒng)的服務(wù)器端包含(SSI)指令的背景知識和使用方法Server對象所要完成的任務(wù),以及與SSI的比較如何使用Server對象實(shí)例、外部組件和應(yīng)用程序如何使用Server對象執(zhí)行封裝的或其他ASP頁面如何使用Server對象管理在中出現(xiàn)的錯誤如何使用Server對象完成與HTML或HTTP兼容的格式轉(zhuǎn)換Server對象是ASP頁中的錯誤處理過程的一部分,這在IIS5.0和ASP3.0中是新的內(nèi)容。本章介紹該對象是如何工作的。因?yàn)橛袉为?dú)的一章(第7章)專門討論有關(guān)調(diào)試和錯誤處理方面的所有問題,所以本章只簡要地討論錯誤處理方法,并且僅限于Server對象直接涉及的過程。ASP是產(chǎn)生動態(tài)eb網(wǎng)頁的一種相對較新的技術(shù)。動態(tài)頁意味著什么呢?先暫時(shí)不考慮客戶端相關(guān)功能上的進(jìn)展,也不討論客戶端、JavaApplet、動態(tài)HTML或ActiveX控件等內(nèi)容。這里的動態(tài)頁是專指服務(wù)器響應(yīng)客戶端請求而產(chǎn)生的頁面,并且根據(jù)情況每次產(chǎn)生的頁面可能是不同的。舉個(gè)簡單的例子,創(chuàng)建一個(gè)只包含當(dāng)前日期和時(shí)間的頁面。每次請求該頁面時(shí)將顯示一個(gè)不同的值,因?yàn)槿掌诤蜁r(shí)間取決于服務(wù)器的時(shí)鐘,或取決于提供日期和時(shí)間的一個(gè)資源(例。當(dāng)然,實(shí)際上動態(tài)頁要比這復(fù)雜得多,也許顯示數(shù)據(jù)庫記錄的當(dāng)前值或者郵件服務(wù)器上等待著的郵件消息的。重要的是服務(wù)器HTML頁面、或磁盤上的文本文件以及把它們發(fā)送給客戶,而且,必須完成一些工作來創(chuàng)建該頁面。第1Web服務(wù)器的一個(gè)接口,它被稱為Internet服務(wù)器應(yīng)用編程接口(InternetServerApplicationProgrammingInterface,ISAPI)。ISAPIC語言風(fēng)格的stdin和stdout數(shù)據(jù)流函數(shù)來客戶端請求的值并創(chuàng)建eb服務(wù)器的響應(yīng)。ISAPI應(yīng)用程序所必須做的全部事情就是編寫相應(yīng)結(jié)果頁面的文本和HTML,并通過stdout函數(shù)輸出到eb服務(wù)器。事實(shí)上ASPDLL內(nèi)部真正做的事情是更面向?qū)ο蟮?。IIS自開始就支持ISAPI的應(yīng)用程序和解釋器。它提供一個(gè)特殊的解釋器動態(tài)庫,給出服務(wù)器的請求和響應(yīng)的另法,盡管受到一定的限制。它通過服務(wù)器端包含指令實(shí)現(xiàn),之所以這樣說,是因?yàn)樗鼈兪窃诜?wù)器上執(zhí)行的,并且結(jié)果包含在傳送給客戶端的響應(yīng)中。這個(gè)特性在IIS中是通過一個(gè)名為ssinc.dll的態(tài)庫現(xiàn)。缺省況,IIS把文件擴(kuò)展名為.shtml、.shtm或.stm的任面都映到個(gè)動態(tài)。打開認(rèn)eb站點(diǎn)的Properties框,在ApplicationSetting中單擊Configuration按鈕,可以看到這種映射,如圖4-1所示。圖4- ApplicationConfiguration這樣,帶有這些被映射的文件擴(kuò)展名的頁面將被傳送給ssinc.dll面中所有的服務(wù)器端包含語句,結(jié)果(的話)插入到服務(wù)器的響應(yīng)中,即插入到客戶端接收因?yàn)檫@些文件是映射到ssinc.dll文件而不是映射到ASP動態(tài)庫(asp.dll)的,所以在這些頁面中的所有ASP代碼將被忽略并且按照原有狀態(tài)傳送給客戶端,客戶端將能夠看到這些。然而,在ASP3.0版本中有一個(gè)避免這種情況的方法,稍后在討論Serve對象的Execute和ransfer方法時(shí),研究這個(gè)方法。利用服務(wù)器端的包含(SSI)語句(或者指令)能夠做些什么呢?實(shí)際上不多,除非打算創(chuàng)建在Web服務(wù)器上運(yùn)行的可執(zhí)行文件,并通過stdin和stdout函數(shù)ISAPI。這就意味能夠用C、達(dá)到與在ASPIIS的SSI特性對使用這些特性的原Web網(wǎng)然而,可能有時(shí)會希望在站點(diǎn)上使用SSI而不是ASP。在IIS5.0中,服務(wù)器端的包含指令能夠比以前更加容易地集成到一個(gè)站點(diǎn)上的ASP頁,它們是有用的,特別是作為執(zhí)行操作系統(tǒng)命令或原有的CGI應(yīng)用程序的式。后面將會非常詳細(xì)地介紹可用的指令。#include指令是這些指令之一,它已經(jīng)與ASP一起使用了一段時(shí)間了,同樣也在SSI頁中使用。事實(shí)上,這已經(jīng)對那些不具備傳統(tǒng)的Web開發(fā)背景的ASP開發(fā)人員帶來了很多。不可思議的 #include指在一個(gè)ASP頁中,可以使用#include指令把另一個(gè)文件的內(nèi)容插入到當(dāng)前的頁面令代<!--#include..-->行。這是一種非常有用的插入HTML段落的技術(shù),可反復(fù)使用。也常用該指令來插入代碼段。例如,如果有一個(gè)包含幾個(gè)函數(shù)(或者只是單行代碼)的文件同時(shí)在幾個(gè)頁面中使用,則可以使用#include指令將其插入到需要它的每個(gè)頁中。通過把和內(nèi)容分開的方法,給頁面提供了一個(gè)組成層次。這意味著如果對進(jìn)行了修改,在客戶端再次打開該頁面時(shí),的修改情況自動地反映到使用包含文件的每個(gè)頁面中。包含文件也是一種插入服務(wù)器特定的信息的簡單方法,所以把站點(diǎn)轉(zhuǎn)移到另一個(gè)服務(wù)器不意味著必須編輯涉及原來服務(wù)器的所有頁面(明顯的例子是數(shù)據(jù)庫連接字符串或指定一個(gè)完整的URL或服務(wù)器名字的)。這可以極大地減少費(fèi)用。使用包含文件的另一種情況是有些內(nèi)容需要按指定的時(shí)間間隔進(jìn)行修改。例如,在roxWebDeverloper站點(diǎn)上顯示書目列表的網(wǎng)頁,它包含了一個(gè)表,其中提供了所有的封面、書名和一些按鈕,如圖4-2所示。這個(gè)表的HTML和文本保留在一個(gè)單獨(dú)的文件中,該文件通過一條單獨(dú)的#include語句包含在主頁中。每次一本新書加入到該網(wǎng)頁所基于的數(shù)據(jù)庫中時(shí),那個(gè)包含文本文件根據(jù)該數(shù)據(jù)庫的情況重新創(chuàng)建,并作為一個(gè)文本文件寫到磁盤上。圖4-2這個(gè)技術(shù)大大地減少了在Web服務(wù)器和數(shù)據(jù)庫服務(wù)器上的工作量,對該站點(diǎn)的者實(shí)包含文件和在ASP網(wǎng)頁(即帶有.asp文件擴(kuò)展名的網(wǎng)頁)中使用的#include指令不能像一條真正的SSI指ASP能夠識別并進(jìn)行語法分析的特別指令。ssinc.dll直接用于執(zhí)行SSI#include指令。然而這個(gè)由相應(yīng)文件的內(nèi)容替代#includ指令的頁面由ASP解釋。這意味著ASP對#includessinc.dll將查找名為<%=strIncludeURL%>如果沒有包含可執(zhí)行,在Web服務(wù)器上的ASP網(wǎng)頁不能通過IIS的Web服務(wù)程序一個(gè)客戶端。但是,有人已經(jīng)發(fā)現(xiàn)了偶然的安全性,比如著名的$DATA問題,所有在NTFS格式化的磁盤上保留Web內(nèi)容的Web服務(wù)器都存在相應(yīng)的問題。在IIS5.0中這個(gè)問題已$DATA問題的出現(xiàn)是因?yàn)樵赪indowsNTFS驅(qū)動器上的所有文件都有一個(gè)缺省的到一個(gè)ASP頁的URL的末尾將打亂IIS中的映射關(guān)系,且允許服務(wù)器不對其中包含的進(jìn)行處理而該頁面。對ISS4.0和早期版本,有一個(gè)方法可以解決這個(gè)問題,或者可以只是增加幾個(gè)映射來強(qiáng)制IIS正常地執(zhí)行該網(wǎng)頁:即增加對“asp::$DATA”和“.asa::$DATA”的映射,兩者都指向asp.dll文件包含文件的擴(kuò)展名一般是.inc或.txt。如果在站點(diǎn)上發(fā)現(xiàn)一個(gè)包含文件的路徑和文件名,的URL鍵入到瀏覽器的地址欄中,該包含文件,而不會把其作為ASP網(wǎng)頁的一部分來執(zhí)行。為防止出現(xiàn)這樣情況,特別是在文件包含有敏感信息(諸如一個(gè)數(shù)據(jù)庫字符串)的情況下,可能希望包含文件的擴(kuò)展名為.asp。在這種情況下,如果試圖一個(gè)包含文件,它將首先被傳送到ASPASP將執(zhí)行該文件中的所有代碼,并只發(fā)送出結(jié)果。如在包含文件中定義的一個(gè)字符串如下:客戶端只能接受到單個(gè)回車符而不是代碼,因?yàn)樵撐募呀?jīng)被ASP在服務(wù)器上執(zhí)行了。如果不包含回車換行符,瀏覽器將掛起并等待一個(gè)響應(yīng)(這并不是我們的問題,因?yàn)槲覀兇_實(shí)不打算允許用戶直接這個(gè)文件)。IIS5.0和Windows的控制列在IIS5.0中, 在IIS早期的版本中,當(dāng)ssinc.dll載入一個(gè)虛擬URL(即使用VIRTUAL="filename"而不是FILE="filename")定位的一個(gè)包含文件時(shí),將繞過Windows本身的安全性檢查并忽略該文件及所 上的任何安全性設(shè)置?,F(xiàn)在,在IIS5.0中,運(yùn)行當(dāng)前ASP或SSI頁面的帳號 Windows控制列表(ACL)中設(shè)置的權(quán)限相一致。如果不一致,該服務(wù)器端包含指令除了已經(jīng)討論過的#include語句以外,還有IIS支持的五條服務(wù)器端包含指令(記住,除#include以外,這些語句不能在ASP網(wǎng)頁中執(zhí)行)。這些服務(wù)器端包含指令及說明如表4-1所表4- 把一個(gè)指定文件的內(nèi)容插入到將被發(fā)送給客戶端的響應(yīng)流中并代替該指令。例如<!--#includeFILE="usefulbits.inc"--這條指令把名為usefulbits.inc文件的內(nèi)容插入到響應(yīng)中。這個(gè)文件可以由一個(gè)相對或全路徑與文件名的組合描述,如FILE="..\scripts\myscr.inc。通過使用VIRTUA屬性,可使用一個(gè)虛擬的相對或絕對路徑來描述它,例如:<!--#includeVIRTUAL="/mysite/usefulbits.inc"--<!--#includeVIRTUAL="../../thisbit/usefulbits.inc"-- 說明在其后的指令中將用于數(shù)據(jù)、時(shí)間和文件大小以及返回給客戶端的一般性的SSI錯誤信<!--#configERRMSG="SSIProcessingError"--設(shè)置SSI錯誤信息內(nèi)容為'SSIProcessingError'<!--#configTIMEFMT="%A,%B%d%Y%M%:H%S"--設(shè)置由其后的SSI指令返回的日期和時(shí)間的格式。這個(gè)例子設(shè)置了一個(gè)格Saturday,August14199910:34:50??梢杂糜诟袷阶址臉?biāo)志的列表在附錄C中給出。<!--#configSIZEFMT="BYTES"--設(shè)置由其后的IIS指令返回的文件大小的單位。這個(gè)例子設(shè)置單位為字SIZEFMT可供 把一個(gè)HTTP環(huán)境變量的值插入到發(fā)送給客戶端的響應(yīng)流中并替換該指令。例如<!--#echoVAR="SERVER_NAME"--寫出正在執(zhí)行指令到該網(wǎng)頁的服務(wù)器 執(zhí)行一個(gè)程序或一個(gè)服務(wù)器外殼命令<!--#execCGI="/scripts/myapp.exe?valuel=this&value2=that-執(zhí)行名為myapp.exe的CGI程序,允許傳遞查詢字符串,程序在單獨(dú)內(nèi)存中執(zhí)行<!--#execCMD="cmd.exe/ciisreset/stop"--啟動特定操作系統(tǒng)命令解釋器(cmo.exe)并執(zhí)行命令sreset/stop。/c表示當(dāng)命令結(jié)束時(shí),命令解釋器也結(jié)束。使用CMO要添加下列表項(xiàng):HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/w3SV設(shè)置值為1,并重啟動WWW服務(wù),就允許CMD標(biāo)志用于#exec指令中。值為0,則使用,#flastmod 把一個(gè)指定的文件上一次修改的日期和時(shí)間插入到發(fā)送給客戶端的響應(yīng)流中并代替該指令。例如:<!--#flastmodFILE="Default.asp"--像#include指令一樣,也可以使用虛擬路徑對該文件進(jìn)行定義,如或 把一個(gè)指定的文件的大小插入到發(fā)送給客戶端的響應(yīng)流中并代替該指<!--#fsizeFILE="Default.asp"--象#include指令一樣,也可以使用虛擬路徑對該文件進(jìn)行定義,如或iisreset.exe是由IIS5.0提供的一個(gè)新的實(shí)用程序。作為一個(gè)命令行的實(shí)用程序,如果用于執(zhí)行該實(shí)用程序的帳號具有管理員權(quán)限,它對于控制運(yùn)行在本地或一個(gè)網(wǎng)絡(luò)計(jì)算機(jī)上的Internet連網(wǎng)服務(wù)是非常有用的。它可用于以正確的順序停止或啟動所有的服務(wù)、顯示服務(wù)的狀態(tài)、重新引導(dǎo)服務(wù)器以及允許或服務(wù)的管理。例如:這將以正確的順序停止和重新啟動所有Internet服務(wù)。如果一種服務(wù)在指定的超時(shí)周期(30秒)內(nèi)未能停止或重新啟動,服務(wù)器將重新引導(dǎo)??梢杂迷贑MD類型的#echoSSI指令中的一些開關(guān),使該頁面不能進(jìn)行并且要求用戶提供在目標(biāo)服務(wù)器上具有管理員權(quán)限的有效帳號的詳細(xì)情況。這個(gè)實(shí)用程序的完整描述和可用令開關(guān)在附錄C中。NETSTOP和NETSTART如果用來執(zhí)行實(shí)用程序net.exe的帳號具有管理員權(quán)限,它可以用來管理服務(wù)器上運(yùn)行的任何服務(wù)(既可以是本地的也可以是來自其他的一個(gè)計(jì)算機(jī) )。雖然不提倡把該程序用于Internet務(wù)(如WWW或FTP務(wù)),但其停止和啟動其他服務(wù)的功能是非常有用的。事實(shí)上,net命令同樣可以用于一系列的其他網(wǎng)絡(luò)相關(guān)命令。net[start|stop service_name例如,可以用命令netstop 和etstartcisvc來停止和啟動 IndexingService可以用CM類型的#echoSSI指令使該頁面不能進(jìn)行并要求用戶提供在目標(biāo)服務(wù)器上具有管理員權(quán)限的有效帳號的詳細(xì)情況。稍后將看到一個(gè)這樣的例子。在Windows2000幫助文件中可以找到net命令的所有選項(xiàng)和開關(guān)的一個(gè)完整列表。從Start菜單中選擇Help項(xiàng),在Help窗口的Index頁查找“netcommands。服務(wù)器端包含指令的本節(jié)提供了一些示例頁面,可以用來對各種服務(wù)器端包含語句進(jìn)行實(shí)驗(yàn)。打開示例網(wǎng)頁的子 Chapter04“SSIDirectivesandtheASPServerObject”主頁(即子Chapter04中的Default.asp),如圖4-3示。圖4-3本書的所有示例都可以從我們 We 。讀者將在示例的使用SSI/CGI處理指單擊進(jìn)入“Server-SideIncludeandCGIStatements”頁面,這將打開ssi_cgi.stm網(wǎng)頁。需要注意的是該頁面的文件擴(kuò)展名為.stm,表明這不是一個(gè)ASP網(wǎng)頁。該頁面使用了前面已經(jīng)4-4所示#include指
圖4-4示例網(wǎng)頁顯示的SSI/CGIIncludeFileswithSSI”,顯示名為intro.inc的另一個(gè)單獨(dú)文件的內(nèi)容。注意須使用HTML條目“<;”和“>;”來顯示網(wǎng)頁中的尖括號。如#config、#fsize和#flastmod 中的文件Default.asp的大小和最后被修改的時(shí)一次是設(shè)置SSI錯誤信息#echo指該頁的最后部分(在屏幕上只能看到一部分)顯示可以使用#eho指令的所有TTP報(bào)頭AR屬性值有變化。附錄G中給出了VAR屬性的所使用#exec#exec指令與其他的SSI指令相比使用起來一些,正因?yàn)槿绱耍瑢⑵洫?dú)立地放到了另“ASPSeverObjectandSSIDirectives”主菜單問啟動頁面。,,圖4-5“TheSSI#execDirectiveUsingthe#echoServer-SideIncludeDirective”。這個(gè)操作打開“,,圖4-5“TheSSI#execDirective這是一個(gè)ASP網(wǎng)頁ssi_exec.asp。兩個(gè)按鈕用來打開.stm頁面,該頁面執(zhí)行其中在服務(wù)器上運(yùn)行這個(gè)示在SSI#exec指令示例能夠在服務(wù)器上工作之前,必須對一些配置進(jìn)行修改。首先,需要在Web服務(wù)器的表中創(chuàng)建SSIEnableCmdDirective項(xiàng)(類型DWORD)位置在下面的鍵名下:然后設(shè)置該值為1,如圖4-6這樣就允許#exec指令與CMD屬性一起使用其次,必須對包含使用#exec指令的.stm文件 帳號的詳細(xì)情況,該帳號應(yīng)是一個(gè)具有管理員級權(quán)限的帳號。這也是net命令正常工作的要圖4-6表中的設(shè)激活I(lǐng)nternetServicesManager應(yīng)用程序,并選擇包含使用#exec指令的.stm文件的(在示例中,這些文件是execstart_cisvc.stm和stop_cisvc.stm)。然后打開該的Properties框。在DirectorySecurity選項(xiàng)卡中單擊Anonymousaccessandauthenticationcontrol區(qū)域中的Edit按鈕,打開AuthenticationMethods框,如圖4-7所示。圖4- 在這個(gè)框中不選中Anonymousaccess復(fù)選框。如果不使用InternetExplorer該頁Basicauthentication選項(xiàng)以允許非I瀏覽器通過提交用戶名/口令該頁面設(shè)時(shí),會出現(xiàn)一個(gè)有關(guān)安全性的警告,單擊es?,F(xiàn)在瀏覽器將被強(qiáng)制出示合適的帳號和明,ServicesMMC插件”,終止IndexingService,如圖4-8啟動和終止Indexing單擊示例Web網(wǎng)頁上的按鈕,啟 IndexingService IndexServer,名稱中的“ci”字符,實(shí)際上代表“contentindexer”。eb服務(wù)器上的具有管理員權(quán)限的一個(gè)帳號的用戶名和口令。當(dāng)該頁面(start_cisvc.stm)打開時(shí),你將感覺到一定的延遲,這是因?yàn)?exec指令載入一個(gè)窗口命令解釋器(cmd.exe)的實(shí)例,然后執(zhí)行netstart命令。一旦服務(wù)啟動(或者如果已經(jīng)在運(yùn)行),將顯示該頁面的其余部分,如圖4-9所示。圖4- 這個(gè)頁面的代碼十分簡單??梢钥吹?exec指令帶有CMD屬性,它設(shè)置為“cmd.exe/cnetstartcisvcSUBMIT按鈕:從前一頁面可以打開其他的.stm網(wǎng)頁,如stop_cisvc.stm用來再次終止該服務(wù),不同之處僅在于使用了netstp命令而不是netst命令。ASPServer正像面看到的那樣,通過服務(wù)器端包含的經(jīng)ISAPIWeb服務(wù)器的頁面,用傳統(tǒng)的例如,可以從Request.ServerVariables集合檢索到所有隨同客戶端的請求發(fā)送過來的HTTP報(bào)頭的值。它幾乎可以與使用SSI#echo相匹敵,同時(shí)具備的主要優(yōu)點(diǎn)是把這些值作為字符串返回到代碼中(而#echo指令簡單地把這些值插入到頁面中,因此可以根據(jù)自己的愿望來檢索和這些字符串。許多相同的參數(shù)應(yīng)用于#fsize和#flastmod有VBScript和JScript引擎中的對象的,同樣也可以容易地獲取這個(gè)信息。在后續(xù)章節(jié)你將看到相#execCGI應(yīng)用程序,不能給供真正的對程的控制。ASPServer對象提供了一種全新的方法,與#exec指令相比,能夠更安全和更容易地運(yùn)行其他的應(yīng)用程序或組件。當(dāng)然,對于一些情況,尤其是在確實(shí)需要執(zhí)行一個(gè)操作系統(tǒng)命令或一個(gè)原有的CGI#exec為了研究Server對象,先概要介紹其所有可用的方法和屬性,然后再進(jìn)一步詳細(xì)地進(jìn)ASPServerServer對象是專為處理服務(wù)器上的特定任務(wù)而設(shè)計(jì)的,特別是與服務(wù)器的環(huán)境和處理活動有關(guān)的任務(wù)。因此提供信息的屬性只有一個(gè),卻有七種方法用來以服務(wù)器特定的方法格式化數(shù)據(jù)、管理其他網(wǎng)頁的執(zhí)行、管理外部對象和組件的執(zhí)行以及處理錯誤。Server對象的唯一一個(gè)屬性用于一個(gè)正在執(zhí)行的ASP網(wǎng)頁的超時(shí)值,如表4-2表4- 整型。缺省值為90設(shè)置或返回頁面的在服務(wù)器退出執(zhí)行和報(bào)告一個(gè)錯誤之前可以執(zhí)行的時(shí)(秒數(shù))。達(dá)到該值后將自動停止頁面的執(zhí)行,并從內(nèi)存中刪除包含可能進(jìn)入死循環(huán)的錯誤的頁面或者是那些長時(shí)間等待其他資源的網(wǎng)頁。這會防止服務(wù)器因存在錯誤的頁面而過載。對于運(yùn)行時(shí)間較長的頁面需要增大這個(gè)值Server對象的方法用于格式化數(shù)據(jù)、管理網(wǎng)頁執(zhí)行和創(chuàng)建其他對象實(shí)例,如表4-3表4- 創(chuàng)建由identifier標(biāo)識的對象(一個(gè)組件、應(yīng)用程序或?qū)ο?的一個(gè)實(shí)例返回可以在代碼中使用的一個(gè)??梢杂糜谝粋€(gè)虛擬應(yīng)用程序(global.asa頁)創(chuàng)建會話層或應(yīng)用程序?qū)臃秶鷥?nèi)的對象。該對象可以用其Cla來標(biāo)識,如clsidBD96C55665A337A9”或一個(gè)ProgID串來標(biāo)識,如 url中指定的網(wǎng)頁。用戶的當(dāng)前環(huán)境(即會話狀態(tài)和當(dāng)前事務(wù)狀態(tài))也傳遞到新的網(wǎng)頁。在該頁面執(zhí)行完成后,控制傳 返回ASPASPError對象的一個(gè),這個(gè)對象包含該頁面在ASP處理過程中發(fā)生的最近一次錯誤的詳細(xì)數(shù)據(jù)。這些由ASPError對象給出的信息包含文 返回一個(gè)字符串,該串是輸入 string的拷貝,但去掉了所有的字符,如<、>、&和雙引號,并轉(zhuǎn)換為等價(jià)的HTML條目,即<、'>'、 返回在url中指定的文件或資源的完整物理路徑和文件 停止當(dāng)前頁面的執(zhí)行,把控制轉(zhuǎn)到url中指定的頁面。用戶的當(dāng)前環(huán)境(即會 返回一個(gè)字符串,該串是輸入 string的拷貝,但是在URL中無效的所有符,如?、&和空格,都轉(zhuǎn)換為等價(jià)的URL條目,即%3F、%26和創(chuàng)建其他對一章中,討論了ASP的虛擬應(yīng)用程序概念,了解了虛擬應(yīng)用程序通過ApplicationProtection設(shè)置為ASP網(wǎng)頁中的組件和其他對象提供進(jìn)程。這沿續(xù)了第1章的討論,即ASP的ObjectContext對象如何為ASP網(wǎng)頁提供運(yùn)行環(huán)境,以及如何使用在相同的環(huán)境中運(yùn)行的其他組件和對象。ASPServer對象提供創(chuàng)建這些組件和應(yīng)用程序?qū)嵗墓δ?,因此可用來擴(kuò)充ASP的能在VBScript和Jscript中創(chuàng)建在VB或VBA中,可使用多種方法創(chuàng)建對象的實(shí)例??梢允褂肗ew關(guān)鍵字來創(chuàng)建指定類型然而,不能在ASP中用VBScript或JScript這么做,因?yàn)檫@些引擎不能實(shí)現(xiàn)數(shù)據(jù)類型定義。不能一個(gè)變量為任意指定的數(shù)據(jù)類型,其變量都是ariants類型,或一個(gè)等價(jià)的類型(根據(jù)使用的語言而定)。在VB和VBA中另一個(gè)方法是使用CreateObject或GetObject方法。CreateObject方法的參數(shù)是一個(gè)Cla(通常情況或一個(gè)ProgID字符串,它返回相應(yīng)類型的一個(gè)新對象:當(dāng)擁有一個(gè)指定的文檔類型,并且想創(chuàng)建一個(gè)可以處理這種文檔的對象實(shí)例時(shí),通常使用GetObject方法:也可以指定所需要的對象類型和文件名,在幾種對象都能處理該文檔類型的情況下,這種做法是非常有用的:VBScript支持CreateObject和GetObject方法。JScript也有g(shù)etObject方法,與VBscriptGetObject工作方式相同。JScript中的ActiveXObject實(shí)現(xiàn)了與VBScript的CreateObject方法相同的功能。但這個(gè)函數(shù)常與JScript的new運(yùn)算符協(xié)同使用:除了VB的New關(guān)鍵字在VBScript和JScript中不予支持以外,能夠使用所有這些技術(shù)在一個(gè)ASP網(wǎng)頁中創(chuàng)建對象的實(shí)例。然而,能夠并不意味著應(yīng)該,而且大多數(shù)情況下不應(yīng)該在一個(gè)ASP網(wǎng)頁中使用引擎的對象創(chuàng)建函數(shù)。在ASP網(wǎng)頁中創(chuàng)建對象為了理解一般的引擎對象創(chuàng)建方法為什么在ASP網(wǎng)頁中使用效果不理想,需進(jìn)一步使用引擎的一般方法在一個(gè)ASP網(wǎng)頁中創(chuàng)建一個(gè)對象實(shí)例時(shí),該對象在當(dāng)前執(zhí)行的頁面的環(huán)境中并未實(shí)例化。得不到ObjectContext對象的,所以不能使用該對象來頁面的環(huán)境,即不能該頁面環(huán)境中的值。這意味著該對象不能使用內(nèi)置的ASP對象,即不能夠在Request、Response、Application和SessionASP對象提供的方法和屬性。該ObjectContext方法放棄一個(gè)事務(wù)。當(dāng)然,你可能不想與該網(wǎng)頁的環(huán)境進(jìn)行交互。但是有其他的理由說明使用一般的對象創(chuàng)建自動地在+運(yùn)行期包裝程序hllhost.dll中實(shí)例化對象,使得該對象可以在當(dāng)前的虛擬應(yīng)用程序中完全地共享和重新使用(缺省的eb本身是一個(gè)虛擬應(yīng)用。你在上一章所看到的對一個(gè)虛擬應(yīng)用程序的設(shè)置,既允許在Web服務(wù)器的內(nèi)存空間中創(chuàng)建對象,也可以在共享的或獨(dú)立的進(jìn)程外DLLHost.dll實(shí)例中創(chuàng)建對象。如果使用一般的引擎對象創(chuàng)建方法,將繞過所有的組件和可擴(kuò)展特性。而在使用ASPServer對象的Server對象的CreateObject為了試驗(yàn)CreateObject方法,打開示例的Chapter04主菜單頁,單擊“UsingtheASPServer這個(gè)打開一個(gè)名為show_server.asp的網(wǎng)頁,該頁面可以用來試驗(yàn)所有的Server對象的方CreateanInstanceofaComponent”區(qū)域,有一個(gè)文本框,可以在其中鍵入想要在該網(wǎng)頁的環(huán)境中創(chuàng)建的對象的ProgID字符串,甚至可以鍵入一個(gè)Cla數(shù)值。這里文本框的缺省值已經(jīng)設(shè)置為一個(gè)來自ActiveX數(shù)據(jù)對象庫的公用對象的ProgID:圖4- 示例程序的Chapter04主菜單圖4- 單擊“Serve.CreateObjec”選項(xiàng)旁的按鈕,把該頁面提交給其自身,因?yàn)樗械目丶荚谝粋€(gè)帶有ACTION屬性的<FORM上,而這個(gè)ACTIONASP代碼(位于<FORM>段的前面)將查看提交該窗體時(shí),單了個(gè)按鈕如是名稱“cmdCreateObject”的按鈕,該代碼將文本框中的ProgID字串。為止戶輸入的ProgID無效而導(dǎo)致執(zhí)行中止,關(guān)閉缺省的錯誤處理,再嘗試使用Server.CreateObject方法創(chuàng)建一個(gè)對象的實(shí)例。最后,再重新打開缺省的錯誤處理,通過使用IsObject函數(shù)檢查是否創(chuàng)建了一個(gè)對象實(shí)例,并顯示一個(gè)相應(yīng)的信息:圖4-12所示的是創(chuàng)建ADODB.Connection對象的結(jié)果??梢钥吹皆搶ο笠驯徽?shí)例化,已可以在代碼中使用。圖4- ADODB.Connection對象實(shí)例化的結(jié)本章不討論如何使用這些對象,你可能已經(jīng)對此很熟悉了。一旦創(chuàng)建了對象實(shí)例,就可以像在任何其他情況中一樣使用它。調(diào)用對象的方法,或設(shè)置屬性,與使用VB時(shí)一樣;或者用瀏覽器中客戶端的VBScript、JSCript使用它在接下來的章節(jié)中將對對象和組件的使用進(jìn)行更加詳細(xì)的介紹。研究由引擎實(shí)現(xiàn)的一些對象,以及IIS5.0/ASP3.0中的可安裝組件,還有一些其他的免費(fèi)或的組件,并討論在各種情況下如何選擇相應(yīng)的組件。在本書的后面,甚至?xí)f明創(chuàng)建自己的能夠在ASP中使用的組件是非常簡單的。執(zhí)行其他的ASP3.0和IIS5.0的新特性之一就是引入了可編程的服務(wù)器端重定向(serve-sideredirection)的概念。這意味著,可以把一個(gè)網(wǎng)頁的控制和執(zhí)行轉(zhuǎn)到另外一個(gè)網(wǎng)頁,而不需要在客戶端使用Response.Redirect方法。ASP編程人員通常使用Response.Redirect語句把一個(gè)頁面載入到當(dāng)前正在執(zhí)行的網(wǎng)頁。然而,許多人沒有這條語句不會自動地使服務(wù)器立即裝入和執(zhí)行新的網(wǎng)頁。其真正做的是把一個(gè)HTTP重定向報(bào)頭(redirectionheader)增加到由eb服務(wù)器發(fā)送給客戶的輸出流中。這個(gè)報(bào)頭如下:在這個(gè)報(bào)頭中的標(biāo)準(zhǔn)HTTP302objectMoved發(fā)生移動。Location報(bào)頭提供相應(yīng)的網(wǎng)頁地址。當(dāng)然這個(gè)地址不一定是真實(shí)的,現(xiàn)在正在做的事情就是“”瀏覽器,使瀏覽器認(rèn)為可在另一個(gè)位置上找到所需要的網(wǎng)頁。實(shí)際發(fā)生的是,服務(wù)器將執(zhí)行所請求的網(wǎng)頁,但是通知瀏覽器需要的網(wǎng)頁已經(jīng)發(fā)生移動。這就是在發(fā)送任何頁面的內(nèi)容到瀏覽器之前必須執(zhí)行Redirect方法的原因。當(dāng)一個(gè)瀏覽器接受到“302objectMoved”信息時(shí),中斷當(dāng)前的請求并為Location值中指定的網(wǎng)頁發(fā)送一個(gè)新的請求。這與在網(wǎng)頁的<HEAD>段使用一個(gè)METAHTTP-EQUIV標(biāo)記時(shí)因此重定向?qū)嶋H上發(fā)生在客戶機(jī)端,而不是在服務(wù)器上。如果在這個(gè)連接的客戶端有一個(gè)服務(wù)器在使用的話,可能會引起顯示虛假消息。服務(wù)器通常會截取該狀態(tài)信息,并且可能產(chǎn)生一個(gè)頁面發(fā)送給提出原始請求的客戶端。這就是在使用Response.Redirect時(shí),“Theobjectyourequestedhasbeenmovedandcanbefoundhere”消息經(jīng)常在客戶機(jī)上顯示的原因,正確地使用緩沖通??梢苑乐惯@個(gè)問題。在IIS4.0或更早的版本中使用Response.Redirect時(shí),應(yīng)該在ASP網(wǎng)頁的開頭打開緩沖,然后在執(zhí)行Response.Redirect方法之前調(diào)用Response.Clear。當(dāng)然,在ASP3.0中網(wǎng)頁緩沖的缺省狀態(tài)為打開,因此這不成問題。只要在執(zhí)行該語句之前使用Response.Clear,以前產(chǎn)生的輸出將不會發(fā)送給客戶。在ASP3.0在ASP3.0和IIS5.0Server對象方法Execut和Transfer,可以避免使用客戶端重定向。這兩個(gè)方法使控制立即轉(zhuǎn)到另一個(gè)網(wǎng)頁,該網(wǎng)頁可以是一個(gè)ASP網(wǎng)頁或者是任何其他的資源,例如一個(gè)HTTP網(wǎng)頁、壓縮文件或其他類型的文件。:Execute方法“調(diào)用”另一個(gè)的網(wǎng)頁,與在代碼中調(diào)用一個(gè)子程序或函數(shù)非常相似。當(dāng)另一個(gè)網(wǎng)頁或資源已經(jīng)執(zhí)行完畢或傳送到客戶端時(shí),控制返回到原網(wǎng)頁中調(diào)用Execute方法的語句的下一條語句,并繼續(xù)執(zhí)行。而使用ransfer方法時(shí),控制不再返回到原頁面中,在控制傳送到的網(wǎng)頁或資源的末尾處,執(zhí)行過程停止。當(dāng)前網(wǎng)頁的環(huán)境也傳送給了目標(biāo)網(wǎng)頁或資源,因此這兩個(gè)方法更有用。網(wǎng)頁環(huán)境包含了原有的ASPRequest、Response和Session對象的集合以及它們的Application對象的環(huán)境。結(jié)果是瀏覽器認(rèn)為它仍在接收原先的頁面,它并不了解服務(wù)器所做的事情。瀏覽器的地址欄一直顯示相同的URL,并且Back、Forward和Refresh按鈕正常地工作。在使用客戶端重定向時(shí),尤其是使用HTMLMETA元素時(shí),情況通常不是這樣的。傳送到新的頁面或資源的環(huán)境包括所有現(xiàn)存的事務(wù)狀態(tài)(transactionstate)。當(dāng)前網(wǎng)頁的環(huán)境用ASP的ObjectContext對象(在第1章中已經(jīng)討論過)進(jìn)行封裝。如果需要將這個(gè)對象作為一Server對象的Execute和Transfer方法的使面的示例頁面中,可以試驗(yàn)使用Execute和Transfer方法。該頁面包含了在示例中已經(jīng)提供的另一個(gè)文件的名字another_page.asp4-1圖4- 使用Execute和Transfer方法的屏單擊Server.Execute和Server.ransfer方法的按鈕,提交到此窗體并重新裝載該窗體。在這個(gè)頁面頂部的代碼查看是哪個(gè)按鈕被單擊。如果是cmdExecute或cmdransfer按鈕,則把當(dāng)前網(wǎng)頁的路徑寫入到輸出流中,然后調(diào)用相應(yīng)的方法,并傳送與該按鈕相聯(lián)系的文本框中的值,然后再把當(dāng)前頁面的路徑寫到輸出流中。Response.Write語句創(chuàng)建并顯示的。后面接著的內(nèi)容是來自被執(zhí)行的網(wǎng)頁(another_page.asp)的一些輸出內(nèi)容。在這之后是第二個(gè)Response.Write語句的輸出內(nèi)容,這表明控制又回到了原先圖4- 頁面的兩條水平線之間的段落(顯示當(dāng)前執(zhí)行的網(wǎng)頁為show_server.asp)來自原先的網(wǎng)頁。Request.ServerVariables("SCRIPT_NAME")獲取它的路徑,因?yàn)榄h(huán)境仍然是原網(wǎng)頁的。我們不得不把頁面名作為文本寫入,因?yàn)閷?shí)在沒有辦法可以從ASP環(huán)境中直接獲取。這里包括了一個(gè)返回前一個(gè)網(wǎng)頁的按鈕的原因是,通過在主網(wǎng)頁中單擊相對應(yīng)的按鈕,可以使用Server.ransfer方法調(diào)用這個(gè)頁面。這次看到了完全相同的輸出,只是沒有第二次路徑輸出,因?yàn)槭恰皞魉汀边@個(gè)頁面而不是“執(zhí)行”該頁面,所以控制不會回傳給原先的網(wǎng)頁,如圖4-15從ASP執(zhí)行SSI
圖4- ASP網(wǎng)頁中成功地使用SSI指令。雖然這種要求不SSI網(wǎng)頁文件擴(kuò)展名是.stm、.shtml和.shtm)含ASP代碼,所以程序不能“無縫”地重定向回到原先的網(wǎng)頁,必須增加一個(gè)按鈕或,以裝載原先的或另外的ASP網(wǎng)頁?,F(xiàn)在,由于有了Server.Execute方法,可以執(zhí)行一個(gè)SSI網(wǎng)頁并且將控制自動返回到原先的網(wǎng)頁,客戶端意識不到這些過程正在進(jìn)行??蛻舳酥皇强吹皆鹊腁SP網(wǎng)頁和執(zhí)行結(jié)果。來自于SSI網(wǎng)頁的任何輸出都“無縫”地插入到流中。當(dāng)然,如果在SSI網(wǎng)頁完成后,不想使原先的網(wǎng)頁繼續(xù)執(zhí)行,可以使用Server.ransfer方法。為了看到這個(gè)技術(shù)的執(zhí)行,把前面使用過的 CGI-SSI例子網(wǎng)頁的虛擬路徑輸入到Server.Excute方法(或Server.ransfer法)的文本框中。這個(gè)路徑是“../ssi_cgi/ssi_cgi.stm。在單擊按鈕對Execute或ransfer方法進(jìn)行調(diào)用以后,將看到.stm網(wǎng)頁已經(jīng)執(zhí)行,其中有SSI指令的結(jié)果。在來自ssi_cgi.stm的內(nèi)容之后出現(xiàn)的是原先的網(wǎng)頁的其余部分,雖然在圖4-16不到,但可通過滾動條看到該內(nèi)容。SSI#exec
圖4- 遺憾的是Execute和ransfer方法一般不能與SSI的#exec指令一起工作,因?yàn)榘@個(gè)指令的.stm網(wǎng)頁會在調(diào)用它的ASP網(wǎng)頁的環(huán)境中運(yùn)行。在大多數(shù)情況下,它需要運(yùn)行于直接該網(wǎng)頁的一個(gè)獨(dú)立的環(huán)境中。存在這樣的限制真是遺憾,如果沒有這種限制,我們通過Server.Execute執(zhí)行的網(wǎng)頁可以“不可見地”包含來自于網(wǎng)頁的指令。對前面的通過etstop和netstart命令停止和啟動IndexingService的示例來說,這可能是一種理想的解決方案??梢栽囍咽褂?exec指令的一個(gè)SSI網(wǎng)頁的虛擬路徑輸入到示例頁面的Server.Execute和Server.Transfer方法的文本框中。前面使用過的exec示例的虛擬路徑是“ssi_cgi/execServer對象的錯誤處ASP沒有錯誤處理機(jī)制一直受到批評在VBScrip中,有一個(gè)OnErrorResumeNext語句,它使解釋器忽略運(yùn)行期錯誤并繼續(xù)代碼的執(zhí)行。接著該可以檢查Err.Number屬性的值,判別是否出現(xiàn)了錯誤。如果出現(xiàn)錯誤,返回一個(gè)非零值。在ASP3.0中,也可以使用OnErrorGoto0“轉(zhuǎn)回到”缺省的錯誤處理。在ASP2.0中實(shí)際也進(jìn)行這種處理,但是沒有相應(yīng)文檔說明。在JScript中,有一個(gè)新的錯誤處理功能:C語言風(fēng)格的try和catch語句。然而所有的這些錯誤處理技術(shù)都不是由ASP或IIS實(shí)現(xiàn)的,而是由ASP使用的引擎實(shí)現(xiàn)的。ASP和IIS的開發(fā)小組已經(jīng)增加了一個(gè)新的功能,用于在ASP網(wǎng)頁中進(jìn)行錯誤處理。這分為兩個(gè)部分:IIS錯誤頁面的配置及使用ASP的一個(gè)新的方法和對象。Server對象的GetLastError在ASP3.0中,Server對象有一個(gè)名為GetLastError的新方法。與VBScript的Err對象不同,不能為查看是否出現(xiàn)了錯誤而隨時(shí)調(diào)用該方法,只能在一個(gè)ASP定制的錯誤網(wǎng)頁中使用。如果像對Er(用OnErrorResumeNext語句)則GetLastError方法不能錯誤的詳細(xì)數(shù)據(jù)。GetLastError方法要做的事情是提供的有關(guān)錯誤源和錯誤原因的信息。GetLastError方法創(chuàng)建并返回一個(gè)對象的,該對象是一個(gè)名為ASPError的新對象。這個(gè)對象具有一系列的屬性,這些屬性返回有關(guān)在GetLastError方法調(diào)用之前出現(xiàn)的錯誤的信息。ASPError對象提供了九個(gè)屬性說明所出現(xiàn)的錯誤的性質(zhì)和錯誤源,并返回錯誤的實(shí)際代碼,其屬性及說明如表4-4所示。表4- 整型。由ASP/IIS產(chǎn)生的錯誤號,例如 字符串型。如果這個(gè)錯誤是與ASP相關(guān)的錯誤,這個(gè)屬性是錯誤的詳細(xì)說 字符串型。錯誤源,即ASP內(nèi)部語言、或一個(gè)對 整型。產(chǎn)生錯誤的文 字符串型。錯誤的簡 字符串型。錯誤出現(xiàn)時(shí)正在處理的文件的名 整型。產(chǎn)生錯誤的文 整型。一個(gè)標(biāo)準(zhǔn)的COM錯誤代 字符串型。錯誤的行的實(shí)際代在IIS中“不可思議”地出現(xiàn)一個(gè)錯誤(例如404NotFound)時(shí),頁面看起來像是從服務(wù)器返回進(jìn)行響應(yīng)時(shí)被并且發(fā)送給客戶端。這些網(wǎng)頁通常稱為定制的錯誤網(wǎng)頁(customerrorpage)。然而,錯誤網(wǎng)頁作為IIS的缺省安裝部分,可根據(jù)要求定制。事實(shí)上,也可以在IIS的早期在IIS4.0中,可以為每種不同類型的HTTP協(xié)議或服務(wù)器錯誤指定一個(gè)定制的錯誤網(wǎng)頁,為服務(wù)器上任意的Web中的每個(gè) IIS缺省的錯誤網(wǎng)由IIS提供的缺省錯誤頁面放在Web服務(wù)器的 中。在Windows2000中IIS5.0的環(huán)境下,該頁面放在 下,如圖4-17所示圖4-17可在瀏覽器中打開這些文件查看結(jié)果,或者在文本編輯器中查看HTML源程序和代碼。當(dāng)一個(gè)404錯誤出現(xiàn)時(shí),使用的頁面是404b.htm,這個(gè)文件包含一個(gè)客戶端代碼部分,它獲得當(dāng)前文檔的URL(從對象的url屬性中檢索)并在該頁面中顯示:IIS中錯誤網(wǎng)頁的映
圖4-18產(chǎn)生404當(dāng)IIS檢測到一個(gè)錯誤時(shí),會把相應(yīng)的錯誤頁面?zhèn)魉徒o客戶端。如何判別應(yīng)該向客戶端發(fā)送那一個(gè)頁面?很明顯,網(wǎng)頁的名字應(yīng)具有解決這個(gè)問題的一些信息,但事實(shí)上文件名是不重要的。錯誤和錯誤網(wǎng)頁文件之間的映射關(guān)系是在每個(gè)的properties框的CustomErro選項(xiàng)卡中決定的。在InternetServicesManager中,在想編輯映射關(guān)系的 上單擊右鍵,并選擇Properties。 圖4- Properties框的CustornErrors選項(xiàng)卡在IIS安裝時(shí)(除非已經(jīng)進(jìn)行過修改)設(shè)置了缺省映射關(guān)系的列表,如圖4-20圖4-20靠近該列表的底部是HTTP錯誤500:100500錯誤是由ASP產(chǎn)生的,可以從中看出一些錯誤已經(jīng)與錯誤網(wǎng)頁建立了映射關(guān)系。這些錯誤都是一般性的錯誤,比如“InvalidApplicationServerShuttingDown”等等。然而,如果ASP載入包含語法錯誤的頁面,或者出現(xiàn)一個(gè)運(yùn)行期錯誤,則出現(xiàn)500:100錯誤頁面。在列表中顯示的缺省映射關(guān)系表500-100.asp頁面。當(dāng)一個(gè)ASP錯誤出現(xiàn)時(shí),我們所看到的信息不再是一個(gè)普通的Web網(wǎng)頁,而是一個(gè)ASP指定一個(gè)定制的錯誤網(wǎng)單擊CustomErrors選項(xiàng)卡中的EditProperties按鈕,打開ErrorMapProperties框。在MessageType下拉列表中選擇URL,鍵入自己的定制錯誤網(wǎng)頁的完整虛擬路徑,如圖4-21所示。圖4-21在圖4-21中給出的值指向我們創(chuàng)建的與示例網(wǎng)頁一起使用的一個(gè)定制錯誤網(wǎng)頁。根據(jù)你安裝示例文件的具置,可能要使用不同的路徑?,F(xiàn)在無論何時(shí)出現(xiàn)一個(gè)500:100類型的錯誤,將打開我們的定制錯誤頁面。MessageDefault(缺省):可以簡單地輸入一個(gè)短的文本信息,而不是指定一個(gè)發(fā)送給客戶端的頁面。File(文件):指定一個(gè)HTTP錯誤網(wǎng)頁的物理路徑在選擇File選項(xiàng)時(shí),指定的網(wǎng)頁由IIS載入,載入的方式與在WindowsExplorer中雙擊要載入的文件時(shí)的方式相同。這意味著ASP網(wǎng)頁不能使用這個(gè)選項(xiàng),因?yàn)樵谶@種使用GetLastError方法和ASPError配置好IIS后,在編輯了錯誤映射屬性的內(nèi)的任一頁面上出現(xiàn)一個(gè)與ASP相關(guān)的錯誤時(shí),都將載入定制錯誤頁面。實(shí)際上,現(xiàn)在已經(jīng)設(shè)置了一個(gè)正常的錯誤陷阱,因?yàn)樵谶@個(gè)內(nèi)的任何一個(gè)網(wǎng)頁上的ASP運(yùn)行期錯誤都將觸發(fā)定制錯誤頁面。事實(shí)上在內(nèi)部IIS通過Server.ransfer方法進(jìn)行這種操作,這意味著能夠正在運(yùn)行的原網(wǎng)頁的全部環(huán)境??梢栽诃h(huán)境中獲取信息,這樣可以根據(jù)所出現(xiàn)的錯誤決定要做些什么。在此基礎(chǔ)上,可以在定制的錯誤網(wǎng)頁中檢索ASPError對象,找到引起載入頁面出錯的錯誤的所有信息。在IIS4.0中,編輯錯誤映射屬性要做一些類似的工作。但是只有一般的500(“InternalServerError”)在映射中是可用的。另外,當(dāng)定制錯誤網(wǎng)頁載入時(shí),不會傳送網(wǎng)頁的環(huán)境,除了提供一個(gè)非特定的錯誤信息外,做其他任何工作都是比較困難的。在以前例子中已經(jīng)使用過ASPServerObject示例頁面,在其中可以看到ASPError對象的鈕,如圖4-22這個(gè)操作會重新載入該網(wǎng)頁,其中的,,查看點(diǎn)擊的是哪個(gè)按鈕。如果是Server.GetLastError()對應(yīng)的名為cmdGetError按鈕將執(zhí)行一些示例代碼,這些代碼將會產(chǎn)生一個(gè)運(yùn)行期 ,,因?yàn)橐褜@ 設(shè)置了錯誤網(wǎng)頁映 圖4- 查看ASPError對象的詳細(xì)情況的屏?xí)r,就打開這個(gè)頁面(通過Server.Transfer方法在不可見地工作),見圖4-23示例錯誤網(wǎng)頁代碼的功圖4-23定制錯誤網(wǎng)頁顯示ASPError對象屬性的所有值,并通過使用Response.Status方法,把一個(gè)HTTP報(bào)頭狀態(tài)消息返回給客戶端,指明出現(xiàn)了一個(gè)錯誤。接著使用GetLastError方法獲取對ASPError對象的一個(gè),因此可以錯誤的詳細(xì)數(shù)據(jù):值得注意的一點(diǎn)是,如果一個(gè)或ASP錯誤出現(xiàn)在定制錯誤網(wǎng)頁中,IIS將僅僅返回一個(gè)與錯誤代碼500:100對應(yīng)的一般性消息。這可能是引擎自己的錯誤消息,或者只是相當(dāng)簡單的消息:“InternalServerError”。不會再次重新載入定制的 ASP內(nèi)部對象集合或?qū)傩灾械闹?。例如,如果檢索來自Request.ServerVariables集合的HHTP_REFERER(即在錯誤出現(xiàn)之前的網(wǎng)頁)的URL。在服務(wù)器把執(zhí)行轉(zhuǎn)到錯誤網(wǎng)頁時(shí),這個(gè)值不會發(fā)生變化,并且它將不包含當(dāng)錯誤發(fā)生時(shí)正在執(zhí)行的網(wǎng)頁的URL。同樣,SCRIPT_NAME值將是包含該錯誤的網(wǎng)頁的名字,而不是錯誤網(wǎng)頁的URL。在一個(gè)錯誤網(wǎng)頁已經(jīng)裝入時(shí),通過檢查瀏覽器地址欄中的URL,可以對此進(jìn)行確認(rèn)。但是在原網(wǎng)如果原ASP網(wǎng)頁正在一個(gè)事務(wù)內(nèi)運(yùn)行,即在網(wǎng)頁的最前面包含有一個(gè)<%@TRANSACTION指令,也應(yīng)該確定是否需要在網(wǎng)頁中采取一些方法,以退出該事務(wù)。使用ASPError對象的關(guān)于使用ASPError對象的屬性,有以下幾點(diǎn)值得注意即使沒有出現(xiàn)錯誤,Number屬性應(yīng)該一直有一個(gè)值。如果ASP網(wǎng)頁調(diào)用GetLastError方法時(shí)沒有錯誤出現(xiàn),該屬性的值是0。通常情況下,對ASP的運(yùn)行期錯誤,NumberSubscriptoutofRange”錯誤的返回值為“0x800A0009”,因?yàn)閂BScript對該類型錯誤的錯誤代碼是“9”。當(dāng)出現(xiàn)已經(jīng)過一個(gè)錯誤時(shí),Category和Description屬性將一直有一個(gè)值A(chǔ)SPCode屬性的值由IIS產(chǎn)生,對大多數(shù)錯誤將為空。情況下,涉及外部組件使用出錯時(shí)有相應(yīng)的值。ASPDescription屬性的值由ASP預(yù)處理程序產(chǎn)生,而不是由當(dāng)前正在使用的引擎產(chǎn)生的,并且對大多數(shù)錯誤而言將是空的。情況下,對諸如對ASP內(nèi)置對象調(diào)用無效的方法的錯誤有相應(yīng)的值。File、Source、Line和column屬性僅在錯誤出現(xiàn)時(shí),并且在錯誤的詳細(xì)數(shù)據(jù)是可用的情況下才能進(jìn)行設(shè)置。對一個(gè)運(yùn)行期錯誤,F(xiàn)ile和Linecolumn屬性經(jīng)常返回-1。當(dāng)錯誤是一個(gè)頁面被ASP回Source屬性。一Line和Column屬性是有效的。如果把Source屬性的值寫到頁面,明智的辦法是先將該值傳給HTMLEncode,以防在其含有的HTML字符。在本章的后面詳細(xì)將地討論HTMLEncode方法。獲取Server對象的路徑信在對在eb上的文件進(jìn)行操作時(shí),需要獲得文件的實(shí)際的物理路徑,而不是使用虛擬路徑或URL,盡管在其他網(wǎng)頁中能用它們正常地定位文件。下一章中有一個(gè)例子,它使用FileSystemObject對eb站點(diǎn)的InetPub\WWWRoo文件夾中的文件進(jìn)行讀寫。當(dāng)創(chuàng)建自己的定制組件或使商業(yè)化組對文件統(tǒng)行,常需要其供一個(gè)件物理路。Server對象的MapPath可以從Request.ServerVariables集合中提取HTTP報(bào)頭變量,它們包含了當(dāng)前文件的物徑(在 _NAME和PTH_TRANSLATED報(bào)頭中)。Server對象提供了一個(gè)方法MapPath,可以使用這個(gè)方法對我們能夠提供一個(gè)有效的虛擬路徑的任何文件提取相應(yīng)的物理用MapPath方法,并可試驗(yàn)使用該方法。4-24所示,在頁面的底部的MiscellaneousMethods部分,有一個(gè)按鈕執(zhí)行Server.MapPath方法,并提供給它靠近該按鈕的文本框中的值。在該網(wǎng)頁的源代碼中已經(jīng)把這個(gè)值設(shè)置為“/lishelp/default.htm頁的URL。圖4- 使用Server.MapPath的屏單擊該按鈕重新裝載這個(gè)網(wǎng)頁,執(zhí)行該方法并在頂部顯示結(jié)果,在下部顯示原頁面的其余部分,如圖4-24示例網(wǎng)頁代碼的功
圖4- 顯示Server.MapPath的結(jié)在該頁面頂部的ASP區(qū)域中,對單擊的按鈕的名字進(jìn)行檢查。在這種情況下,該按鈕的名字將是cmdMapPath,簡單地把相匹配的文本框中的值txtMapPath傳送給Server.MapPath方法,并顯示得到的結(jié)果:MapPath和虛擬應(yīng)用程注意,MapPath方法為/iishelp/default.htm文件獲取的結(jié)果在Web服務(wù) 外,并在 的 中。這清楚地證明了MapPath方法是非常有用的對于在缺省的Web中的文件,其URL的路徑部分與物理路徑通常是相同的。例如,一個(gè)文件在Web服務(wù)器上:如果安裝時(shí)已經(jīng)在缺 中安裝了的Web ,則URL如下然而,IISHelp文件安裝在缺省Web根外的一個(gè)虛擬中,所以用于對其進(jìn)行的URL和物理路徑之間沒有直接的關(guān)聯(lián)。只有通過使用Server.MapPath方法才能獲取真實(shí)使用Server對象格式化數(shù)當(dāng)前面討論演示SSI指令的網(wǎng)頁的代碼時(shí),碰巧遇到了使用HTML的一個(gè)老問題。在一個(gè)HTML網(wǎng)頁中如何顯示HTML代碼?如果“照現(xiàn)在的樣子”使用,也就是在相應(yīng)的位置上使用所有的HTML字符,會被瀏覽器當(dāng)作HTML進(jìn)行解釋和執(zhí)行。這樣當(dāng)下列內(nèi)容在瀏覽器中顯示時(shí):為了避免這種情況,必須把在HTML中或無效的所有字符轉(zhuǎn)換到等價(jià)的HTML字符實(shí)體(characterentity)。多數(shù)常見的字符如表4-5所示。表4- 字符與等價(jià)的HTML實(shí)體的關(guān)字符等價(jià)的HTML 等價(jià)的HTML實(shí)< &; ? 一部分,這些語言是基于SGML(標(biāo)準(zhǔn)化常規(guī)標(biāo)識語言)規(guī)則的,如HTML語言。數(shù)字的HTML實(shí)體等價(jià)字注意最后一個(gè)例子,已的商標(biāo)符號?是一個(gè)以“#”字符為前綴的數(shù)字值,而不是相應(yīng)含義的一個(gè)文本縮寫(如copy對應(yīng)符號)。具有一個(gè)大于126的ANSI代碼值的所有字符事實(shí)上,需要留心的是使用數(shù)字實(shí)體等價(jià)字符串要優(yōu)先于一些較少被支持的文本實(shí)體字(),該字符的實(shí)體等價(jià)字符串為"™"但不是所有瀏覽器(例如Navigator)都能識別這個(gè)字符串,這種情況下,將在網(wǎng)頁中顯示該實(shí)體字符串。相反,使用在所有瀏覽器中都能很好地工作。Server對象的HTMLEncode把HTML轉(zhuǎn)換為文本是進(jìn)行有效顯示需要的,否 HTML會被瀏覽器當(dāng)成HTML來對待執(zhí)行,這意味著必須對無效的字符進(jìn)行編碼,使其成為等價(jià)的HTML實(shí)體字符串。為管理這種轉(zhuǎn)換,Server對象提供了HTMLEncode方法??梢栽诒緯峁┑腁SPServerObject示例網(wǎng)頁中簡單地把一些文本輸入到HTMLEncode對應(yīng)的文本框中并單擊按鈕。示例中提供了一些真實(shí)的HM作為缺省的文本,如圖4所示。圖4- 重新載入該頁面時(shí),在該頁面的頂部顯示結(jié)果。HTMLEncode方法把尖括號轉(zhuǎn)換成了“<;”和“>;”,而且把雙引號轉(zhuǎn)換成為“";”,如圖4-27所示。示例網(wǎng)頁代碼的功
圖4- 使用HTMLEncode方法首先,在方法名字后面的括號中已經(jīng)丟掉了<B>和</B>標(biāo)記,相應(yīng)增加了一個(gè)粗體文本部分。在網(wǎng)頁中顯示原有的值時(shí),<B>和</B>被當(dāng)成HTML提交了,所以<B>和</B>標(biāo)記可以十分容易地避免這種情況。事實(shí)上,這就是設(shè)計(jì)HTMLEncode方法的原因。原示例現(xiàn)在所能做的就是把HTMLEncode方法應(yīng)用于正在輸出的值圖4- 使用HTMLEncode方法的結(jié)果現(xiàn)在已經(jīng)解決了不提交HTMLHTML的問題。但是如果要在HTML中顯示HTMLEncode方法的結(jié)果,而又不提交和處理這些結(jié)果,又會發(fā)生什么情況?為了解決這個(gè)問題,要從HTMLEncod方法本身考慮:上面的語句在HTML網(wǎng)頁中得不到同樣的顯示結(jié)果,這是因?yàn)镠TML字符實(shí)體將被瀏覽器我們沒看到實(shí)體。為了避免這種情況,可兩次使用Server.HTNLEncode方法。這就把“&”HTMLEncode與HTML控件的缺省從上面可以看出,如果在一個(gè)HTML網(wǎng)頁中要顯示HTML代碼,而又不使之被作為HTMLHTNLEncodeASP網(wǎng)頁中不大
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中南大學(xué)《教育電視節(jié)目設(shè)計(jì)與制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 菏澤家政職業(yè)學(xué)院《體育一啦啦操》2023-2024學(xué)年第二學(xué)期期末試卷
- 云南農(nóng)業(yè)大學(xué)《無線通信與車聯(lián)網(wǎng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 臺州職業(yè)技術(shù)學(xué)院《兒童青少年社會工作實(shí)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 防毒防艾主題班會課件
- 石家莊職業(yè)技術(shù)學(xué)院《外國美術(shù)史》2023-2024學(xué)年第二學(xué)期期末試卷
- 石家莊財(cái)經(jīng)職業(yè)學(xué)院《機(jī)器學(xué)習(xí)B》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025:項(xiàng)目部與供應(yīng)商安全生產(chǎn)供應(yīng)合同 項(xiàng)目部與供應(yīng)商如何配合
- 武漢音樂學(xué)院《企業(yè)形象策劃》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇城市職業(yè)學(xué)院《國際共產(chǎn)主義運(yùn)動史》2023-2024學(xué)年第二學(xué)期期末試卷
- 春天就是我童聲合唱簡譜
- 每日30字練字格電子版
- 雷鋒叔叔你在哪里教學(xué)反思
- 鋼拱橋?qū)m?xiàng)吊裝方案終稿
- 24式太極拳教案(1~4課)
- 哈薩克斯坦鐵路車站代碼
- 產(chǎn)業(yè)經(jīng)濟(jì)學(xué)的課后復(fù)習(xí)答案
- 中國綠色經(jīng)濟(jì)發(fā)展之路(PPT-37張)課件
- 客房控制系統(tǒng)——RCU系統(tǒng)培訓(xùn)PPT通用通用課件
- 履帶式液壓挖掘機(jī)挖掘機(jī)構(gòu)設(shè)計(jì)
- (會議紀(jì)要(2011)第29期)河南煤業(yè)化工集團(tuán)有限責(zé)任公司會議紀(jì)要
評論
0/150
提交評論