下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4 服務(wù)器進(jìn)程和ASPServer對(duì)前面的章節(jié)已經(jīng)研究了ASP的一些內(nèi)置對(duì)象。重點(diǎn)介紹的對(duì)象有Request、Response、Session和Application對(duì)象。ASP中另一個(gè)比較主要的對(duì)象為Server對(duì)象。本章重點(diǎn)介紹這個(gè)對(duì)象的背景知識(shí)和使用方法。Server對(duì)象在服務(wù)器端中通過實(shí)例和使用其他外部對(duì)象和組件,提供了一種擴(kuò)展ASP頁(yè)的功能的方法。事實(shí)上,許多人認(rèn)為這個(gè)對(duì)象是ASP之所以能夠流行的主要因素。引入Server對(duì)象的意義很大,這意味著ASP不必提供人們所需要的所有屬性。它可調(diào)用其他應(yīng)用程序和組件完成指定工作。這也恰好符合了構(gòu)建由獨(dú)立的對(duì)象組成的應(yīng)用程序的總體目標(biāo),而不是構(gòu)建通常見到的那種耗盡硬盤空間的“可做每件事情”的巨型程序。不僅僅是在計(jì)算機(jī)的世界中,整個(gè)世界正在朝著組件和“即插即用”概念方面發(fā)展。如今,當(dāng)汽車或電視機(jī)發(fā)生故障時(shí),或工很可能會(huì)拔出有問題的部件并且插上一個(gè)新的部件,因此,汽車人員或電視機(jī)維修人員的工作也變成了面向?qū)ο蟮?。IIS同樣支持使用外部對(duì)象和與服務(wù)器環(huán)境進(jìn)行交互作用的許多傳統(tǒng)方法。這是一個(gè)特定的例外,這些方法并不是真正的ASP組成部分,但通常的確非常有用,并且通過ServeASP很好地進(jìn)行了集成。本章將簡(jiǎn)要地回顧這些傳統(tǒng)方法,然后詳細(xì)地介紹ASPServer傳統(tǒng)的服務(wù)器端包含(SSI)指令的背景知識(shí)和使用方法Server對(duì)象所要完成的任務(wù),以及與SSI的比較如何使用Server對(duì)象實(shí)例、外部組件和應(yīng)用程序如何使用Server對(duì)象執(zhí)行封裝的或其他ASP頁(yè)面如何使用Server對(duì)象管理在中出現(xiàn)的錯(cuò)誤如何使用Server對(duì)象完成與HTML或HTTP兼容的格式轉(zhuǎn)換Server對(duì)象是ASP頁(yè)中的錯(cuò)誤處理過程的一部分,這在IIS5.0和ASP3.0中是新的內(nèi)容。本章介紹該對(duì)象是如何工作的。因?yàn)橛袉为?dú)的一章(第7章)專門討論有關(guān)調(diào)試和錯(cuò)誤處理方面的所有問題,所以本章只簡(jiǎn)要地討論錯(cuò)誤處理方法,并且僅限于Server對(duì)象直接涉及的過程。ASP是產(chǎn)生動(dòng)態(tài)eb網(wǎng)頁(yè)的一種相對(duì)較新的技術(shù)。動(dòng)態(tài)頁(yè)意味著什么呢?先暫時(shí)不考慮客戶端相關(guān)功能上的進(jìn)展,也不討論客戶端、JavaApplet、動(dòng)態(tài)HTML或ActiveX控件等內(nèi)容。這里的動(dòng)態(tài)頁(yè)是專指服務(wù)器響應(yīng)客戶端請(qǐng)求而產(chǎn)生的頁(yè)面,并且根據(jù)情況每次產(chǎn)生的頁(yè)面可能是不同的。舉個(gè)簡(jiǎn)單的例子,創(chuàng)建一個(gè)只包含當(dāng)前日期和時(shí)間的頁(yè)面。每次請(qǐng)求該頁(yè)面時(shí)將顯示一個(gè)不同的值,因?yàn)槿掌诤蜁r(shí)間取決于服務(wù)器的時(shí)鐘,或取決于提供日期和時(shí)間的一個(gè)資源(例。當(dāng)然,實(shí)際上動(dòng)態(tài)頁(yè)要比這復(fù)雜得多,也許顯示數(shù)據(jù)庫(kù)記錄的當(dāng)前值或者郵件服務(wù)器上等待著的郵件消息的。重要的是服務(wù)器HTML頁(yè)面、或磁盤上的文本文件以及把它們發(fā)送給客戶,而且,必須完成一些工作來創(chuàng)建該頁(yè)面。第1Web服務(wù)器的一個(gè)接口,它被稱為Internet服務(wù)器應(yīng)用編程接口(InternetServerApplicationProgrammingInterface,ISAPI)。ISAPIC語言風(fēng)格的stdin和stdout數(shù)據(jù)流函數(shù)來客戶端請(qǐng)求的值并創(chuàng)建eb服務(wù)器的響應(yīng)。ISAPI應(yīng)用程序所必須做的全部事情就是編寫相應(yīng)結(jié)果頁(yè)面的文本和HTML,并通過stdout函數(shù)輸出到eb服務(wù)器。事實(shí)上ASPDLL內(nèi)部真正做的事情是更面向?qū)ο蟮摹IS自開始就支持ISAPI的應(yīng)用程序和解釋器。它提供一個(gè)特殊的解釋器動(dòng)態(tài)庫(kù),給出服務(wù)器的請(qǐng)求和響應(yīng)的另法,盡管受到一定的限制。它通過服務(wù)器端包含指令實(shí)現(xiàn),之所以這樣說,是因?yàn)樗鼈兪窃诜?wù)器上執(zhí)行的,并且結(jié)果包含在傳送給客戶端的響應(yīng)中。這個(gè)特性在IIS中是通過一個(gè)名為ssinc.dll的態(tài)庫(kù)現(xiàn)。缺省況,IIS把文件擴(kuò)展名為.shtml、.shtm或.stm的任面都映到個(gè)動(dòng)態(tài)。打開認(rèn)eb站點(diǎn)的Properties框,在ApplicationSetting中單擊Configuration按鈕,可以看到這種映射,如圖4-1所示。圖4- ApplicationConfiguration這樣,帶有這些被映射的文件擴(kuò)展名的頁(yè)面將被傳送給ssinc.dll面中所有的服務(wù)器端包含語句,結(jié)果(的話)插入到服務(wù)器的響應(yīng)中,即插入到客戶端接收因?yàn)檫@些文件是映射到ssinc.dll文件而不是映射到ASP動(dòng)態(tài)庫(kù)(asp.dll)的,所以在這些頁(yè)面中的所有ASP代碼將被忽略并且按照原有狀態(tài)傳送給客戶端,客戶端將能夠看到這些。然而,在ASP3.0版本中有一個(gè)避免這種情況的方法,稍后在討論Serve對(duì)象的Execute和ransfer方法時(shí),研究這個(gè)方法。利用服務(wù)器端的包含(SSI)語句(或者指令)能夠做些什么呢?實(shí)際上不多,除非打算創(chuàng)建在Web服務(wù)器上運(yùn)行的可執(zhí)行文件,并通過stdin和stdout函數(shù)ISAPI。這就意味能夠用C、達(dá)到與在ASPIIS的SSI特性對(duì)使用這些特性的原Web網(wǎng)然而,可能有時(shí)會(huì)希望在站點(diǎn)上使用SSI而不是ASP。在IIS5.0中,服務(wù)器端的包含指令能夠比以前更加容易地集成到一個(gè)站點(diǎn)上的ASP頁(yè),它們是有用的,特別是作為執(zhí)行操作系統(tǒng)命令或原有的CGI應(yīng)用程序的式。后面將會(huì)非常詳細(xì)地介紹可用的指令。#include指令是這些指令之一,它已經(jīng)與ASP一起使用了一段時(shí)間了,同樣也在SSI頁(yè)中使用。事實(shí)上,這已經(jīng)對(duì)那些不具備傳統(tǒng)的Web開發(fā)背景的ASP開發(fā)人員帶來了很多。不可思議的 #include指在一個(gè)ASP頁(yè)中,可以使用#include指令把另一個(gè)文件的內(nèi)容插入到當(dāng)前的頁(yè)面令代<!--#include..-->行。這是一種非常有用的插入HTML段落的技術(shù),可反復(fù)使用。也常用該指令來插入代碼段。例如,如果有一個(gè)包含幾個(gè)函數(shù)(或者只是單行代碼)的文件同時(shí)在幾個(gè)頁(yè)面中使用,則可以使用#include指令將其插入到需要它的每個(gè)頁(yè)中。通過把和內(nèi)容分開的方法,給頁(yè)面提供了一個(gè)組成層次。這意味著如果對(duì)進(jìn)行了修改,在客戶端再次打開該頁(yè)面時(shí),的修改情況自動(dòng)地反映到使用包含文件的每個(gè)頁(yè)面中。包含文件也是一種插入服務(wù)器特定的信息的簡(jiǎn)單方法,所以把站點(diǎn)轉(zhuǎn)移到另一個(gè)服務(wù)器不意味著必須編輯涉及原來服務(wù)器的所有頁(yè)面(明顯的例子是數(shù)據(jù)庫(kù)連接字符串或指定一個(gè)完整的URL或服務(wù)器名字的)。這可以極大地減少費(fèi)用。使用包含文件的另一種情況是有些內(nèi)容需要按指定的時(shí)間間隔進(jìn)行修改。例如,在roxWebDeverloper站點(diǎn)上顯示書目列表的網(wǎng)頁(yè),它包含了一個(gè)表,其中提供了所有的封面、書名和一些按鈕,如圖4-2所示。這個(gè)表的HTML和文本保留在一個(gè)單獨(dú)的文件中,該文件通過一條單獨(dú)的#include語句包含在主頁(yè)中。每次一本新書加入到該網(wǎng)頁(yè)所基于的數(shù)據(jù)庫(kù)中時(shí),那個(gè)包含文本文件根據(jù)該數(shù)據(jù)庫(kù)的情況重新創(chuàng)建,并作為一個(gè)文本文件寫到磁盤上。圖4-2這個(gè)技術(shù)大大地減少了在Web服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器上的工作量,對(duì)該站點(diǎn)的者實(shí)包含文件和在ASP網(wǎng)頁(yè)(即帶有.asp文件擴(kuò)展名的網(wǎng)頁(yè))中使用的#include指令不能像一條真正的SSI指ASP能夠識(shí)別并進(jìn)行語法分析的特別指令。ssinc.dll直接用于執(zhí)行SSI#include指令。然而這個(gè)由相應(yīng)文件的內(nèi)容替代#includ指令的頁(yè)面由ASP解釋。這意味著ASP對(duì)#includessinc.dll將查找名為<%=strIncludeURL%>如果沒有包含可執(zhí)行,在Web服務(wù)器上的ASP網(wǎng)頁(yè)不能通過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ū)動(dòng)器上的所有文件都有一個(gè)缺省的到一個(gè)ASP頁(yè)的URL的末尾將打亂IIS中的映射關(guān)系,且允許服務(wù)器不對(duì)其中包含的進(jìn)行處理而該頁(yè)面。對(duì)ISS4.0和早期版本,有一個(gè)方法可以解決這個(gè)問題,或者可以只是增加幾個(gè)映射來強(qiáng)制IIS正常地執(zhí)行該網(wǎng)頁(yè):即增加對(duì)“asp::$DATA”和“.asa::$DATA”的映射,兩者都指向asp.dll文件包含文件的擴(kuò)展名一般是.inc或.txt。如果在站點(diǎn)上發(fā)現(xiàn)一個(gè)包含文件的路徑和文件名,的URL鍵入到瀏覽器的地址欄中,該包含文件,而不會(huì)把其作為ASP網(wǎng)頁(yè)的一部分來執(zhí)行。為防止出現(xiàn)這樣情況,特別是在文件包含有敏感信息(諸如一個(gè)數(shù)據(jù)庫(kù)字符串)的情況下,可能希望包含文件的擴(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頁(yè)面的帳號(hào) Windows控制列表(ACL)中設(shè)置的權(quán)限相一致。如果不一致,該服務(wù)器端包含指令除了已經(jīng)討論過的#include語句以外,還有IIS支持的五條服務(wù)器端包含指令(記住,除#include以外,這些語句不能在ASP網(wǎng)頁(yè)中執(zhí)行)。這些服務(wù)器端包含指令及說明如表4-1所表4- 把一個(gè)指定文件的內(nèi)容插入到將被發(fā)送給客戶端的響應(yīng)流中并代替該指令。例如<!--#includeFILE="usefulbits.inc"--這條指令把名為usefulbits.inc文件的內(nèi)容插入到響應(yīng)中。這個(gè)文件可以由一個(gè)相對(duì)或全路徑與文件名的組合描述,如FILE="..\scripts\myscr.inc。通過使用VIRTUA屬性,可使用一個(gè)虛擬的相對(duì)或絕對(duì)路徑來描述它,例如:<!--#includeVIRTUAL="/mysite/usefulbits.inc"--<!--#includeVIRTUAL="../../thisbit/usefulbits.inc"-- 說明在其后的指令中將用于數(shù)據(jù)、時(shí)間和文件大小以及返回給客戶端的一般性的SSI錯(cuò)誤信<!--#configERRMSG="SSIProcessingError"--設(shè)置SSI錯(cuò)誤信息內(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)頁(yè)的服務(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"--啟動(dòng)特定操作系統(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,并重啟動(dòng)WWW服務(wù),就允許CMD標(biāo)志用于#exec指令中。值為0,則使用,#flastmod 把一個(gè)指定的文件上一次修改的日期和時(shí)間插入到發(fā)送給客戶端的響應(yīng)流中并代替該指令。例如:<!--#flastmodFILE="Default.asp"--像#include指令一樣,也可以使用虛擬路徑對(duì)該文件進(jìn)行定義,如或 把一個(gè)指定的文件的大小插入到發(fā)送給客戶端的響應(yīng)流中并代替該指<!--#fsizeFILE="Default.asp"--象#include指令一樣,也可以使用虛擬路徑對(duì)該文件進(jìn)行定義,如或iisreset.exe是由IIS5.0提供的一個(gè)新的實(shí)用程序。作為一個(gè)命令行的實(shí)用程序,如果用于執(zhí)行該實(shí)用程序的帳號(hào)具有管理員權(quán)限,它對(duì)于控制運(yùn)行在本地或一個(gè)網(wǎng)絡(luò)計(jì)算機(jī)上的Internet連網(wǎng)服務(wù)是非常有用的。它可用于以正確的順序停止或啟動(dòng)所有的服務(wù)、顯示服務(wù)的狀態(tài)、重新引導(dǎo)服務(wù)器以及允許或服務(wù)的管理。例如:這將以正確的順序停止和重新啟動(dòng)所有Internet服務(wù)。如果一種服務(wù)在指定的超時(shí)周期(30秒)內(nèi)未能停止或重新啟動(dòng),服務(wù)器將重新引導(dǎo)??梢杂迷贑MD類型的#echoSSI指令中的一些開關(guān),使該頁(yè)面不能進(jìn)行并且要求用戶提供在目標(biāo)服務(wù)器上具有管理員權(quán)限的有效帳號(hào)的詳細(xì)情況。這個(gè)實(shí)用程序的完整描述和可用令開關(guān)在附錄C中。NETSTOP和NETSTART如果用來執(zhí)行實(shí)用程序net.exe的帳號(hào)具有管理員權(quán)限,它可以用來管理服務(wù)器上運(yùn)行的任何服務(wù)(既可以是本地的也可以是來自其他的一個(gè)計(jì)算機(jī) )。雖然不提倡把該程序用于Internet務(wù)(如WWW或FTP務(wù)),但其停止和啟動(dòng)其他服務(wù)的功能是非常有用的。事實(shí)上,net命令同樣可以用于一系列的其他網(wǎng)絡(luò)相關(guān)命令。net[start|stop service_name例如,可以用命令netstop 和etstartcisvc來停止和啟動(dòng) IndexingService可以用CM類型的#echoSSI指令使該頁(yè)面不能進(jìn)行并要求用戶提供在目標(biāo)服務(wù)器上具有管理員權(quán)限的有效帳號(hào)的詳細(xì)情況。稍后將看到一個(gè)這樣的例子。在Windows2000幫助文件中可以找到net命令的所有選項(xiàng)和開關(guān)的一個(gè)完整列表。從Start菜單中選擇Help項(xiàng),在Help窗口的Index頁(yè)查找“netcommands。服務(wù)器端包含指令的本節(jié)提供了一些示例頁(yè)面,可以用來對(duì)各種服務(wù)器端包含語句進(jìn)行實(shí)驗(yàn)。打開示例網(wǎng)頁(yè)的子 Chapter04“SSIDirectivesandtheASPServerObject”主頁(yè)(即子Chapter04中的Default.asp),如圖4-3示。圖4-3本書的所有示例都可以從我們 We 。讀者將在示例的使用SSI/CGI處理指單擊進(jìn)入“Server-SideIncludeandCGIStatements”頁(yè)面,這將打開ssi_cgi.stm網(wǎng)頁(yè)。需要注意的是該頁(yè)面的文件擴(kuò)展名為.stm,表明這不是一個(gè)ASP網(wǎng)頁(yè)。該頁(yè)面使用了前面已經(jīng)4-4所示#include指
圖4-4示例網(wǎng)頁(yè)顯示的SSI/CGIIncludeFileswithSSI”,顯示名為intro.inc的另一個(gè)單獨(dú)文件的內(nèi)容。注意須使用HTML條目“<;”和“>;”來顯示網(wǎng)頁(yè)中的尖括號(hào)。如#config、#fsize和#flastmod 中的文件Default.asp的大小和最后被修改的時(shí)一次是設(shè)置SSI錯(cuò)誤信息#echo指該頁(yè)的最后部分(在屏幕上只能看到一部分)顯示可以使用#eho指令的所有TTP報(bào)頭AR屬性值有變化。附錄G中給出了VAR屬性的所使用#exec#exec指令與其他的SSI指令相比使用起來一些,正因?yàn)槿绱?,將其?dú)立地放到了另“ASPSeverObjectandSSIDirectives”主菜單問啟動(dòng)頁(yè)面。,,圖4-5“TheSSI#execDirectiveUsingthe#echoServer-SideIncludeDirective”。這個(gè)操作打開“,,圖4-5“TheSSI#execDirective這是一個(gè)ASP網(wǎng)頁(yè)ssi_exec.asp。兩個(gè)按鈕用來打開.stm頁(yè)面,該頁(yè)面執(zhí)行其中在服務(wù)器上運(yùn)行這個(gè)示在SSI#exec指令示例能夠在服務(wù)器上工作之前,必須對(duì)一些配置進(jìn)行修改。首先,需要在Web服務(wù)器的表中創(chuàng)建SSIEnableCmdDirective項(xiàng)(類型DWORD)位置在下面的鍵名下:然后設(shè)置該值為1,如圖4-6這樣就允許#exec指令與CMD屬性一起使用其次,必須對(duì)包含使用#exec指令的.stm文件 帳號(hào)的詳細(xì)情況,該帳號(hào)應(yīng)是一個(gè)具有管理員級(jí)權(quán)限的帳號(hào)。這也是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該頁(yè)Basicauthentication選項(xiàng)以允許非I瀏覽器通過提交用戶名/口令該頁(yè)面設(shè)時(shí),會(huì)出現(xiàn)一個(gè)有關(guān)安全性的警告,單擊es。現(xiàn)在瀏覽器將被強(qiáng)制出示合適的帳號(hào)和明,ServicesMMC插件”,終止IndexingService,如圖4-8啟動(dòng)和終止Indexing單擊示例Web網(wǎng)頁(yè)上的按鈕,啟 IndexingService IndexServer,名稱中的“ci”字符,實(shí)際上代表“contentindexer”。eb服務(wù)器上的具有管理員權(quán)限的一個(gè)帳號(hào)的用戶名和口令。當(dāng)該頁(yè)面(start_cisvc.stm)打開時(shí),你將感覺到一定的延遲,這是因?yàn)?exec指令載入一個(gè)窗口命令解釋器(cmd.exe)的實(shí)例,然后執(zhí)行netstart命令。一旦服務(wù)啟動(dòng)(或者如果已經(jīng)在運(yùn)行),將顯示該頁(yè)面的其余部分,如圖4-9所示。圖4- 這個(gè)頁(yè)面的代碼十分簡(jiǎn)單??梢钥吹?exec指令帶有CMD屬性,它設(shè)置為“cmd.exe/cnetstartcisvcSUBMIT按鈕:從前一頁(yè)面可以打開其他的.stm網(wǎng)頁(yè),如stop_cisvc.stm用來再次終止該服務(wù),不同之處僅在于使用了netstp命令而不是netst命令。ASPServer正像面看到的那樣,通過服務(wù)器端包含的經(jīng)ISAPIWeb服務(wù)器的頁(yè)面,用傳統(tǒng)的例如,可以從Request.ServerVariables集合檢索到所有隨同客戶端的請(qǐng)求發(fā)送過來的HTTP報(bào)頭的值。它幾乎可以與使用SSI#echo相匹敵,同時(shí)具備的主要優(yōu)點(diǎn)是把這些值作為字符串返回到代碼中(而#echo指令簡(jiǎn)單地把這些值插入到頁(yè)面中,因此可以根據(jù)自己的愿望來檢索和這些字符串。許多相同的參數(shù)應(yīng)用于#fsize和#flastmod有VBScript和JScript引擎中的對(duì)象的,同樣也可以容易地獲取這個(gè)信息。在后續(xù)章節(jié)你將看到相#execCGI應(yīng)用程序,不能給供真正的對(duì)程的控制。ASPServer對(duì)象提供了一種全新的方法,與#exec指令相比,能夠更安全和更容易地運(yùn)行其他的應(yīng)用程序或組件。當(dāng)然,對(duì)于一些情況,尤其是在確實(shí)需要執(zhí)行一個(gè)操作系統(tǒng)命令或一個(gè)原有的CGI#exec為了研究Server對(duì)象,先概要介紹其所有可用的方法和屬性,然后再進(jìn)一步詳細(xì)地進(jìn)ASPServerServer對(duì)象是專為處理服務(wù)器上的特定任務(wù)而設(shè)計(jì)的,特別是與服務(wù)器的環(huán)境和處理活動(dòng)有關(guān)的任務(wù)。因此提供信息的屬性只有一個(gè),卻有七種方法用來以服務(wù)器特定的方法格式化數(shù)據(jù)、管理其他網(wǎng)頁(yè)的執(zhí)行、管理外部對(duì)象和組件的執(zhí)行以及處理錯(cuò)誤。Server對(duì)象的唯一一個(gè)屬性用于一個(gè)正在執(zhí)行的ASP網(wǎng)頁(yè)的超時(shí)值,如表4-2表4- 整型。缺省值為90設(shè)置或返回頁(yè)面的在服務(wù)器退出執(zhí)行和報(bào)告一個(gè)錯(cuò)誤之前可以執(zhí)行的時(shí)(秒數(shù))。達(dá)到該值后將自動(dòng)停止頁(yè)面的執(zhí)行,并從內(nèi)存中刪除包含可能進(jìn)入死循環(huán)的錯(cuò)誤的頁(yè)面或者是那些長(zhǎng)時(shí)間等待其他資源的網(wǎng)頁(yè)。這會(huì)防止服務(wù)器因存在錯(cuò)誤的頁(yè)面而過載。對(duì)于運(yùn)行時(shí)間較長(zhǎng)的頁(yè)面需要增大這個(gè)值Server對(duì)象的方法用于格式化數(shù)據(jù)、管理網(wǎng)頁(yè)執(zhí)行和創(chuàng)建其他對(duì)象實(shí)例,如表4-3表4- 創(chuàng)建由identifier標(biāo)識(shí)的對(duì)象(一個(gè)組件、應(yīng)用程序或?qū)ο?的一個(gè)實(shí)例返回可以在代碼中使用的一個(gè)。可以用于一個(gè)虛擬應(yīng)用程序(global.asa頁(yè))創(chuàng)建會(huì)話層或應(yīng)用程序?qū)臃秶鷥?nèi)的對(duì)象。該對(duì)象可以用其Cla來標(biāo)識(shí),如clsidBD96C55665A337A9”或一個(gè)ProgID串來標(biāo)識(shí),如 url中指定的網(wǎng)頁(yè)。用戶的當(dāng)前環(huán)境(即會(huì)話狀態(tài)和當(dāng)前事務(wù)狀態(tài))也傳遞到新的網(wǎng)頁(yè)。在該頁(yè)面執(zhí)行完成后,控制傳 返回ASPASPError對(duì)象的一個(gè),這個(gè)對(duì)象包含該頁(yè)面在ASP處理過程中發(fā)生的最近一次錯(cuò)誤的詳細(xì)數(shù)據(jù)。這些由ASPError對(duì)象給出的信息包含文 返回一個(gè)字符串,該串是輸入 string的拷貝,但去掉了所有的字符,如<、>、&和雙引號(hào),并轉(zhuǎn)換為等價(jià)的HTML條目,即<、'>'、 返回在url中指定的文件或資源的完整物理路徑和文件 停止當(dāng)前頁(yè)面的執(zhí)行,把控制轉(zhuǎn)到url中指定的頁(yè)面。用戶的當(dāng)前環(huán)境(即會(huì) 返回一個(gè)字符串,該串是輸入 string的拷貝,但是在URL中無效的所有符,如?、&和空格,都轉(zhuǎn)換為等價(jià)的URL條目,即%3F、%26和創(chuàng)建其他對(duì)一章中,討論了ASP的虛擬應(yīng)用程序概念,了解了虛擬應(yīng)用程序通過ApplicationProtection設(shè)置為ASP網(wǎng)頁(yè)中的組件和其他對(duì)象提供進(jìn)程。這沿續(xù)了第1章的討論,即ASP的ObjectContext對(duì)象如何為ASP網(wǎng)頁(yè)提供運(yùn)行環(huán)境,以及如何使用在相同的環(huán)境中運(yùn)行的其他組件和對(duì)象。ASPServer對(duì)象提供創(chuàng)建這些組件和應(yīng)用程序?qū)嵗墓δ?,因此可用來擴(kuò)充ASP的能在VBScript和Jscript中創(chuàng)建在VB或VBA中,可使用多種方法創(chuàng)建對(duì)象的實(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è)新對(duì)象:當(dāng)擁有一個(gè)指定的文檔類型,并且想創(chuàng)建一個(gè)可以處理這種文檔的對(duì)象實(shí)例時(shí),通常使用GetObject方法:也可以指定所需要的對(duì)象類型和文件名,在幾種對(duì)象都能處理該文檔類型的情況下,這種做法是非常有用的: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)頁(yè)中創(chuàng)建對(duì)象的實(shí)例。然而,能夠并不意味著應(yīng)該,而且大多數(shù)情況下不應(yīng)該在一個(gè)ASP網(wǎng)頁(yè)中使用引擎的對(duì)象創(chuàng)建函數(shù)。在ASP網(wǎng)頁(yè)中創(chuàng)建對(duì)象為了理解一般的引擎對(duì)象創(chuàng)建方法為什么在ASP網(wǎng)頁(yè)中使用效果不理想,需進(jìn)一步使用引擎的一般方法在一個(gè)ASP網(wǎng)頁(yè)中創(chuàng)建一個(gè)對(duì)象實(shí)例時(shí),該對(duì)象在當(dāng)前執(zhí)行的頁(yè)面的環(huán)境中并未實(shí)例化。得不到ObjectContext對(duì)象的,所以不能使用該對(duì)象來頁(yè)面的環(huán)境,即不能該頁(yè)面環(huán)境中的值。這意味著該對(duì)象不能使用內(nèi)置的ASP對(duì)象,即不能夠在Request、Response、Application和SessionASP對(duì)象提供的方法和屬性。該ObjectContext方法放棄一個(gè)事務(wù)。當(dāng)然,你可能不想與該網(wǎng)頁(yè)的環(huán)境進(jìn)行交互。但是有其他的理由說明使用一般的對(duì)象創(chuàng)建自動(dòng)地在+運(yùn)行期包裝程序hllhost.dll中實(shí)例化對(duì)象,使得該對(duì)象可以在當(dāng)前的虛擬應(yīng)用程序中完全地共享和重新使用(缺省的eb本身是一個(gè)虛擬應(yīng)用。你在上一章所看到的對(duì)一個(gè)虛擬應(yīng)用程序的設(shè)置,既允許在Web服務(wù)器的內(nèi)存空間中創(chuàng)建對(duì)象,也可以在共享的或獨(dú)立的進(jìn)程外DLLHost.dll實(shí)例中創(chuàng)建對(duì)象。如果使用一般的引擎對(duì)象創(chuàng)建方法,將繞過所有的組件和可擴(kuò)展特性。而在使用ASPServer對(duì)象的Server對(duì)象的CreateObject為了試驗(yàn)CreateObject方法,打開示例的Chapter04主菜單頁(yè),單擊“UsingtheASPServer這個(gè)打開一個(gè)名為show_server.asp的網(wǎng)頁(yè),該頁(yè)面可以用來試驗(yàn)所有的Server對(duì)象的方CreateanInstanceofaComponent”區(qū)域,有一個(gè)文本框,可以在其中鍵入想要在該網(wǎng)頁(yè)的環(huán)境中創(chuàng)建的對(duì)象的ProgID字符串,甚至可以鍵入一個(gè)Cla數(shù)值。這里文本框的缺省值已經(jīng)設(shè)置為一個(gè)來自ActiveX數(shù)據(jù)對(duì)象庫(kù)的公用對(duì)象的ProgID:圖4- 示例程序的Chapter04主菜單圖4- 單擊“Serve.CreateObjec”選項(xiàng)旁的按鈕,把該頁(yè)面提交給其自身,因?yàn)樗械目丶荚谝粋€(gè)帶有ACTION屬性的<FORM上,而這個(gè)ACTIONASP代碼(位于<FORM>段的前面)將查看提交該窗體時(shí),單了個(gè)按鈕如是名稱“cmdCreateObject”的按鈕,該代碼將文本框中的ProgID字串。為止戶輸入的ProgID無效而導(dǎo)致執(zhí)行中止,關(guān)閉缺省的錯(cuò)誤處理,再嘗試使用Server.CreateObject方法創(chuàng)建一個(gè)對(duì)象的實(shí)例。最后,再重新打開缺省的錯(cuò)誤處理,通過使用IsObject函數(shù)檢查是否創(chuàng)建了一個(gè)對(duì)象實(shí)例,并顯示一個(gè)相應(yīng)的信息:圖4-12所示的是創(chuàng)建ADODB.Connection對(duì)象的結(jié)果。可以看到該對(duì)象已被正常實(shí)例化,已可以在代碼中使用。圖4- ADODB.Connection對(duì)象實(shí)例化的結(jié)本章不討論如何使用這些對(duì)象,你可能已經(jīng)對(duì)此很熟悉了。一旦創(chuàng)建了對(duì)象實(shí)例,就可以像在任何其他情況中一樣使用它。調(diào)用對(duì)象的方法,或設(shè)置屬性,與使用VB時(shí)一樣;或者用瀏覽器中客戶端的VBScript、JSCript使用它在接下來的章節(jié)中將對(duì)對(duì)象和組件的使用進(jìn)行更加詳細(xì)的介紹。研究由引擎實(shí)現(xiàn)的一些對(duì)象,以及IIS5.0/ASP3.0中的可安裝組件,還有一些其他的免費(fèi)或的組件,并討論在各種情況下如何選擇相應(yīng)的組件。在本書的后面,甚至?xí)f明創(chuàng)建自己的能夠在ASP中使用的組件是非常簡(jiǎn)單的。執(zhí)行其他的ASP3.0和IIS5.0的新特性之一就是引入了可編程的服務(wù)器端重定向(serve-sideredirection)的概念。這意味著,可以把一個(gè)網(wǎng)頁(yè)的控制和執(zhí)行轉(zhuǎn)到另外一個(gè)網(wǎng)頁(yè),而不需要在客戶端使用Response.Redirect方法。ASP編程人員通常使用Response.Redirect語句把一個(gè)頁(yè)面載入到當(dāng)前正在執(zhí)行的網(wǎng)頁(yè)。然而,許多人沒有這條語句不會(huì)自動(dòng)地使服務(wù)器立即裝入和執(zhí)行新的網(wǎng)頁(yè)。其真正做的是把一個(gè)HTTP重定向報(bào)頭(redirectionheader)增加到由eb服務(wù)器發(fā)送給客戶的輸出流中。這個(gè)報(bào)頭如下:在這個(gè)報(bào)頭中的標(biāo)準(zhǔn)HTTP302objectMoved發(fā)生移動(dòng)。Location報(bào)頭提供相應(yīng)的網(wǎng)頁(yè)地址。當(dāng)然這個(gè)地址不一定是真實(shí)的,現(xiàn)在正在做的事情就是“”瀏覽器,使瀏覽器認(rèn)為可在另一個(gè)位置上找到所需要的網(wǎng)頁(yè)。實(shí)際發(fā)生的是,服務(wù)器將執(zhí)行所請(qǐng)求的網(wǎng)頁(yè),但是通知瀏覽器需要的網(wǎng)頁(yè)已經(jīng)發(fā)生移動(dòng)。這就是在發(fā)送任何頁(yè)面的內(nèi)容到瀏覽器之前必須執(zhí)行Redirect方法的原因。當(dāng)一個(gè)瀏覽器接受到“302objectMoved”信息時(shí),中斷當(dāng)前的請(qǐng)求并為L(zhǎng)ocation值中指定的網(wǎng)頁(yè)發(fā)送一個(gè)新的請(qǐng)求。這與在網(wǎng)頁(yè)的<HEAD>段使用一個(gè)METAHTTP-EQUIV標(biāo)記時(shí)因此重定向?qū)嶋H上發(fā)生在客戶機(jī)端,而不是在服務(wù)器上。如果在這個(gè)連接的客戶端有一個(gè)服務(wù)器在使用的話,可能會(huì)引起顯示虛假消息。服務(wù)器通常會(huì)截取該狀態(tài)信息,并且可能產(chǎn)生一個(gè)頁(yè)面發(fā)送給提出原始請(qǐng)求的客戶端。這就是在使用Response.Redirect時(shí),“Theobjectyourequestedhasbeenmovedandcanbefoundhere”消息經(jīng)常在客戶機(jī)上顯示的原因,正確地使用緩沖通??梢苑乐惯@個(gè)問題。在IIS4.0或更早的版本中使用Response.Redirect時(shí),應(yīng)該在ASP網(wǎng)頁(yè)的開頭打開緩沖,然后在執(zhí)行Response.Redirect方法之前調(diào)用Response.Clear。當(dāng)然,在ASP3.0中網(wǎng)頁(yè)緩沖的缺省狀態(tài)為打開,因此這不成問題。只要在執(zhí)行該語句之前使用Response.Clear,以前產(chǎn)生的輸出將不會(huì)發(fā)送給客戶。在ASP3.0在ASP3.0和IIS5.0Server對(duì)象方法Execut和Transfer,可以避免使用客戶端重定向。這兩個(gè)方法使控制立即轉(zhuǎn)到另一個(gè)網(wǎng)頁(yè),該網(wǎng)頁(yè)可以是一個(gè)ASP網(wǎng)頁(yè)或者是任何其他的資源,例如一個(gè)HTTP網(wǎng)頁(yè)、壓縮文件或其他類型的文件。:Execute方法“調(diào)用”另一個(gè)的網(wǎng)頁(yè),與在代碼中調(diào)用一個(gè)子程序或函數(shù)非常相似。當(dāng)另一個(gè)網(wǎng)頁(yè)或資源已經(jīng)執(zhí)行完畢或傳送到客戶端時(shí),控制返回到原網(wǎng)頁(yè)中調(diào)用Execute方法的語句的下一條語句,并繼續(xù)執(zhí)行。而使用ransfer方法時(shí),控制不再返回到原頁(yè)面中,在控制傳送到的網(wǎng)頁(yè)或資源的末尾處,執(zhí)行過程停止。當(dāng)前網(wǎng)頁(yè)的環(huán)境也傳送給了目標(biāo)網(wǎng)頁(yè)或資源,因此這兩個(gè)方法更有用。網(wǎng)頁(yè)環(huán)境包含了原有的ASPRequest、Response和Session對(duì)象的集合以及它們的Application對(duì)象的環(huán)境。結(jié)果是瀏覽器認(rèn)為它仍在接收原先的頁(yè)面,它并不了解服務(wù)器所做的事情。瀏覽器的地址欄一直顯示相同的URL,并且Back、Forward和Refresh按鈕正常地工作。在使用客戶端重定向時(shí),尤其是使用HTMLMETA元素時(shí),情況通常不是這樣的。傳送到新的頁(yè)面或資源的環(huán)境包括所有現(xiàn)存的事務(wù)狀態(tài)(transactionstate)。當(dāng)前網(wǎng)頁(yè)的環(huán)境用ASP的ObjectContext對(duì)象(在第1章中已經(jīng)討論過)進(jìn)行封裝。如果需要將這個(gè)對(duì)象作為一Server對(duì)象的Execute和Transfer方法的使面的示例頁(yè)面中,可以試驗(yàn)使用Execute和Transfer方法。該頁(yè)面包含了在示例中已經(jīng)提供的另一個(gè)文件的名字another_page.asp4-1圖4- 使用Execute和Transfer方法的屏單擊Server.Execute和Server.ransfer方法的按鈕,提交到此窗體并重新裝載該窗體。在這個(gè)頁(yè)面頂部的代碼查看是哪個(gè)按鈕被單擊。如果是cmdExecute或cmdransfer按鈕,則把當(dāng)前網(wǎng)頁(yè)的路徑寫入到輸出流中,然后調(diào)用相應(yīng)的方法,并傳送與該按鈕相聯(lián)系的文本框中的值,然后再把當(dāng)前頁(yè)面的路徑寫到輸出流中。Response.Write語句創(chuàng)建并顯示的。后面接著的內(nèi)容是來自被執(zhí)行的網(wǎng)頁(yè)(another_page.asp)的一些輸出內(nèi)容。在這之后是第二個(gè)Response.Write語句的輸出內(nèi)容,這表明控制又回到了原先圖4- 頁(yè)面的兩條水平線之間的段落(顯示當(dāng)前執(zhí)行的網(wǎng)頁(yè)為show_server.asp)來自原先的網(wǎng)頁(yè)。Request.ServerVariables("SCRIPT_NAME")獲取它的路徑,因?yàn)榄h(huán)境仍然是原網(wǎng)頁(yè)的。我們不得不把頁(yè)面名作為文本寫入,因?yàn)閷?shí)在沒有辦法可以從ASP環(huán)境中直接獲取。這里包括了一個(gè)返回前一個(gè)網(wǎng)頁(yè)的按鈕的原因是,通過在主網(wǎng)頁(yè)中單擊相對(duì)應(yīng)的按鈕,可以使用Server.ransfer方法調(diào)用這個(gè)頁(yè)面。這次看到了完全相同的輸出,只是沒有第二次路徑輸出,因?yàn)槭恰皞魉汀边@個(gè)頁(yè)面而不是“執(zhí)行”該頁(yè)面,所以控制不會(huì)回傳給原先的網(wǎng)頁(yè),如圖4-15從ASP執(zhí)行SSI
圖4- ASP網(wǎng)頁(yè)中成功地使用SSI指令。雖然這種要求不SSI網(wǎng)頁(yè)文件擴(kuò)展名是.stm、.shtml和.shtm)含ASP代碼,所以程序不能“無縫”地重定向回到原先的網(wǎng)頁(yè),必須增加一個(gè)按鈕或,以裝載原先的或另外的ASP網(wǎng)頁(yè)?,F(xiàn)在,由于有了Server.Execute方法,可以執(zhí)行一個(gè)SSI網(wǎng)頁(yè)并且將控制自動(dòng)返回到原先的網(wǎng)頁(yè),客戶端意識(shí)不到這些過程正在進(jìn)行。客戶端只是看到原先的ASP網(wǎng)頁(yè)和執(zhí)行結(jié)果。來自于SSI網(wǎng)頁(yè)的任何輸出都“無縫”地插入到流中。當(dāng)然,如果在SSI網(wǎng)頁(yè)完成后,不想使原先的網(wǎng)頁(yè)繼續(xù)執(zhí)行,可以使用Server.ransfer方法。為了看到這個(gè)技術(shù)的執(zhí)行,把前面使用過的 CGI-SSI例子網(wǎng)頁(yè)的虛擬路徑輸入到Server.Excute方法(或Server.ransfer法)的文本框中。這個(gè)路徑是“../ssi_cgi/ssi_cgi.stm。在單擊按鈕對(duì)Execute或ransfer方法進(jìn)行調(diào)用以后,將看到.stm網(wǎng)頁(yè)已經(jīng)執(zhí)行,其中有SSI指令的結(jié)果。在來自ssi_cgi.stm的內(nèi)容之后出現(xiàn)的是原先的網(wǎng)頁(yè)的其余部分,雖然在圖4-16不到,但可通過滾動(dòng)條看到該內(nèi)容。SSI#exec
圖4- 遺憾的是Execute和ransfer方法一般不能與SSI的#exec指令一起工作,因?yàn)榘@個(gè)指令的.stm網(wǎng)頁(yè)會(huì)在調(diào)用它的ASP網(wǎng)頁(yè)的環(huán)境中運(yùn)行。在大多數(shù)情況下,它需要運(yùn)行于直接該網(wǎng)頁(yè)的一個(gè)獨(dú)立的環(huán)境中。存在這樣的限制真是遺憾,如果沒有這種限制,我們通過Server.Execute執(zhí)行的網(wǎng)頁(yè)可以“不可見地”包含來自于網(wǎng)頁(yè)的指令。對(duì)前面的通過etstop和netstart命令停止和啟動(dòng)IndexingService的示例來說,這可能是一種理想的解決方案。可以試著把使用#exec指令的一個(gè)SSI網(wǎng)頁(yè)的虛擬路徑輸入到示例頁(yè)面的Server.Execute和Server.Transfer方法的文本框中。前面使用過的exec示例的虛擬路徑是“ssi_cgi/execServer對(duì)象的錯(cuò)誤處ASP沒有錯(cuò)誤處理機(jī)制一直受到批評(píng)在VBScrip中,有一個(gè)OnErrorResumeNext語句,它使解釋器忽略運(yùn)行期錯(cuò)誤并繼續(xù)代碼的執(zhí)行。接著該可以檢查Err.Number屬性的值,判別是否出現(xiàn)了錯(cuò)誤。如果出現(xiàn)錯(cuò)誤,返回一個(gè)非零值。在ASP3.0中,也可以使用OnErrorGoto0“轉(zhuǎn)回到”缺省的錯(cuò)誤處理。在ASP2.0中實(shí)際也進(jìn)行這種處理,但是沒有相應(yīng)文檔說明。在JScript中,有一個(gè)新的錯(cuò)誤處理功能:C語言風(fēng)格的try和catch語句。然而所有的這些錯(cuò)誤處理技術(shù)都不是由ASP或IIS實(shí)現(xiàn)的,而是由ASP使用的引擎實(shí)現(xiàn)的。ASP和IIS的開發(fā)小組已經(jīng)增加了一個(gè)新的功能,用于在ASP網(wǎng)頁(yè)中進(jìn)行錯(cuò)誤處理。這分為兩個(gè)部分:IIS錯(cuò)誤頁(yè)面的配置及使用ASP的一個(gè)新的方法和對(duì)象。Server對(duì)象的GetLastError在ASP3.0中,Server對(duì)象有一個(gè)名為GetLastError的新方法。與VBScript的Err對(duì)象不同,不能為查看是否出現(xiàn)了錯(cuò)誤而隨時(shí)調(diào)用該方法,只能在一個(gè)ASP定制的錯(cuò)誤網(wǎng)頁(yè)中使用。如果像對(duì)Er(用OnErrorResumeNext語句)則GetLastError方法不能錯(cuò)誤的詳細(xì)數(shù)據(jù)。GetLastError方法要做的事情是提供的有關(guān)錯(cuò)誤源和錯(cuò)誤原因的信息。GetLastError方法創(chuàng)建并返回一個(gè)對(duì)象的,該對(duì)象是一個(gè)名為ASPError的新對(duì)象。這個(gè)對(duì)象具有一系列的屬性,這些屬性返回有關(guān)在GetLastError方法調(diào)用之前出現(xiàn)的錯(cuò)誤的信息。ASPError對(duì)象提供了九個(gè)屬性說明所出現(xiàn)的錯(cuò)誤的性質(zhì)和錯(cuò)誤源,并返回錯(cuò)誤的實(shí)際代碼,其屬性及說明如表4-4所示。表4- 整型。由ASP/IIS產(chǎn)生的錯(cuò)誤號(hào),例如 字符串型。如果這個(gè)錯(cuò)誤是與ASP相關(guān)的錯(cuò)誤,這個(gè)屬性是錯(cuò)誤的詳細(xì)說 字符串型。錯(cuò)誤源,即ASP內(nèi)部語言、或一個(gè)對(duì) 整型。產(chǎn)生錯(cuò)誤的文 字符串型。錯(cuò)誤的簡(jiǎn) 字符串型。錯(cuò)誤出現(xiàn)時(shí)正在處理的文件的名 整型。產(chǎn)生錯(cuò)誤的文 整型。一個(gè)標(biāo)準(zhǔn)的COM錯(cuò)誤代 字符串型。錯(cuò)誤的行的實(shí)際代在IIS中“不可思議”地出現(xiàn)一個(gè)錯(cuò)誤(例如404NotFound)時(shí),頁(yè)面看起來像是從服務(wù)器返回進(jìn)行響應(yīng)時(shí)被并且發(fā)送給客戶端。這些網(wǎng)頁(yè)通常稱為定制的錯(cuò)誤網(wǎng)頁(yè)(customerrorpage)。然而,錯(cuò)誤網(wǎng)頁(yè)作為IIS的缺省安裝部分,可根據(jù)要求定制。事實(shí)上,也可以在IIS的早期在IIS4.0中,可以為每種不同類型的HTTP協(xié)議或服務(wù)器錯(cuò)誤指定一個(gè)定制的錯(cuò)誤網(wǎng)頁(yè),為服務(wù)器上任意的Web中的每個(gè) IIS缺省的錯(cuò)誤網(wǎng)由IIS提供的缺省錯(cuò)誤頁(yè)面放在Web服務(wù)器的 中。在Windows2000中IIS5.0的環(huán)境下,該頁(yè)面放在 下,如圖4-17所示圖4-17可在瀏覽器中打開這些文件查看結(jié)果,或者在文本編輯器中查看HTML源程序和代碼。當(dāng)一個(gè)404錯(cuò)誤出現(xiàn)時(shí),使用的頁(yè)面是404b.htm,這個(gè)文件包含一個(gè)客戶端代碼部分,它獲得當(dāng)前文檔的URL(從對(duì)象的url屬性中檢索)并在該頁(yè)面中顯示:IIS中錯(cuò)誤網(wǎng)頁(yè)的映
圖4-18產(chǎn)生404當(dāng)IIS檢測(cè)到一個(gè)錯(cuò)誤時(shí),會(huì)把相應(yīng)的錯(cuò)誤頁(yè)面?zhèn)魉徒o客戶端。如何判別應(yīng)該向客戶端發(fā)送那一個(gè)頁(yè)面?很明顯,網(wǎng)頁(yè)的名字應(yīng)具有解決這個(gè)問題的一些信息,但事實(shí)上文件名是不重要的。錯(cuò)誤和錯(cuò)誤網(wǎng)頁(yè)文件之間的映射關(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錯(cuò)誤500:100500錯(cuò)誤是由ASP產(chǎn)生的,可以從中看出一些錯(cuò)誤已經(jīng)與錯(cuò)誤網(wǎng)頁(yè)建立了映射關(guān)系。這些錯(cuò)誤都是一般性的錯(cuò)誤,比如“InvalidApplicationServerShuttingDown”等等。然而,如果ASP載入包含語法錯(cuò)誤的頁(yè)面,或者出現(xiàn)一個(gè)運(yùn)行期錯(cuò)誤,則出現(xiàn)500:100錯(cuò)誤頁(yè)面。在列表中顯示的缺省映射關(guān)系表500-100.asp頁(yè)面。當(dāng)一個(gè)ASP錯(cuò)誤出現(xiàn)時(shí),我們所看到的信息不再是一個(gè)普通的Web網(wǎng)頁(yè),而是一個(gè)ASP指定一個(gè)定制的錯(cuò)誤網(wǎng)單擊CustomErrors選項(xiàng)卡中的EditProperties按鈕,打開ErrorMapProperties框。在MessageType下拉列表中選擇URL,鍵入自己的定制錯(cuò)誤網(wǎng)頁(yè)的完整虛擬路徑,如圖4-21所示。圖4-21在圖4-21中給出的值指向我們創(chuàng)建的與示例網(wǎng)頁(yè)一起使用的一個(gè)定制錯(cuò)誤網(wǎng)頁(yè)。根據(jù)你安裝示例文件的具置,可能要使用不同的路徑?,F(xiàn)在無論何時(shí)出現(xiàn)一個(gè)500:100類型的錯(cuò)誤,將打開我們的定制錯(cuò)誤頁(yè)面。MessageDefault(缺省):可以簡(jiǎn)單地輸入一個(gè)短的文本信息,而不是指定一個(gè)發(fā)送給客戶端的頁(yè)面。File(文件):指定一個(gè)HTTP錯(cuò)誤網(wǎng)頁(yè)的物理路徑在選擇File選項(xiàng)時(shí),指定的網(wǎng)頁(yè)由IIS載入,載入的方式與在WindowsExplorer中雙擊要載入的文件時(shí)的方式相同。這意味著ASP網(wǎng)頁(yè)不能使用這個(gè)選項(xiàng),因?yàn)樵谶@種使用GetLastError方法和ASPError配置好IIS后,在編輯了錯(cuò)誤映射屬性的內(nèi)的任一頁(yè)面上出現(xiàn)一個(gè)與ASP相關(guān)的錯(cuò)誤時(shí),都將載入定制錯(cuò)誤頁(yè)面。實(shí)際上,現(xiàn)在已經(jīng)設(shè)置了一個(gè)正常的錯(cuò)誤陷阱,因?yàn)樵谶@個(gè)內(nèi)的任何一個(gè)網(wǎng)頁(yè)上的ASP運(yùn)行期錯(cuò)誤都將觸發(fā)定制錯(cuò)誤頁(yè)面。事實(shí)上在內(nèi)部IIS通過Server.ransfer方法進(jìn)行這種操作,這意味著能夠正在運(yùn)行的原網(wǎng)頁(yè)的全部環(huán)境。可以在環(huán)境中獲取信息,這樣可以根據(jù)所出現(xiàn)的錯(cuò)誤決定要做些什么。在此基礎(chǔ)上,可以在定制的錯(cuò)誤網(wǎng)頁(yè)中檢索ASPError對(duì)象,找到引起載入頁(yè)面出錯(cuò)的錯(cuò)誤的所有信息。在IIS4.0中,編輯錯(cuò)誤映射屬性要做一些類似的工作。但是只有一般的500(“InternalServerError”)在映射中是可用的。另外,當(dāng)定制錯(cuò)誤網(wǎng)頁(yè)載入時(shí),不會(huì)傳送網(wǎng)頁(yè)的環(huán)境,除了提供一個(gè)非特定的錯(cuò)誤信息外,做其他任何工作都是比較困難的。在以前例子中已經(jīng)使用過ASPServerObject示例頁(yè)面,在其中可以看到ASPError對(duì)象的鈕,如圖4-22這個(gè)操作會(huì)重新載入該網(wǎng)頁(yè),其中的,,查看點(diǎn)擊的是哪個(gè)按鈕。如果是Server.GetLastError()對(duì)應(yīng)的名為cmdGetError按鈕將執(zhí)行一些示例代碼,這些代碼將會(huì)產(chǎn)生一個(gè)運(yùn)行期 ,,因?yàn)橐褜?duì)這 設(shè)置了錯(cuò)誤網(wǎng)頁(yè)映 圖4- 查看ASPError對(duì)象的詳細(xì)情況的屏?xí)r,就打開這個(gè)頁(yè)面(通過Server.Transfer方法在不可見地工作),見圖4-23示例錯(cuò)誤網(wǎng)頁(yè)代碼的功圖4-23定制錯(cuò)誤網(wǎng)頁(yè)顯示ASPError對(duì)象屬性的所有值,并通過使用Response.Status方法,把一個(gè)HTTP報(bào)頭狀態(tài)消息返回給客戶端,指明出現(xiàn)了一個(gè)錯(cuò)誤。接著使用GetLastError方法獲取對(duì)ASPError對(duì)象的一個(gè),因此可以錯(cuò)誤的詳細(xì)數(shù)據(jù):值得注意的一點(diǎn)是,如果一個(gè)或ASP錯(cuò)誤出現(xiàn)在定制錯(cuò)誤網(wǎng)頁(yè)中,IIS將僅僅返回一個(gè)與錯(cuò)誤代碼500:100對(duì)應(yīng)的一般性消息。這可能是引擎自己的錯(cuò)誤消息,或者只是相當(dāng)簡(jiǎn)單的消息:“InternalServerError”。不會(huì)再次重新載入定制的 ASP內(nèi)部對(duì)象集合或?qū)傩灾械闹怠@?,如果檢索來自Request.ServerVariables集合的HHTP_REFERER(即在錯(cuò)誤出現(xiàn)之前的網(wǎng)頁(yè))的URL。在服務(wù)器把執(zhí)行轉(zhuǎn)到錯(cuò)誤網(wǎng)頁(yè)時(shí),這個(gè)值不會(huì)發(fā)生變化,并且它將不包含當(dāng)錯(cuò)誤發(fā)生時(shí)正在執(zhí)行的網(wǎng)頁(yè)的URL。同樣,SCRIPT_NAME值將是包含該錯(cuò)誤的網(wǎng)頁(yè)的名字,而不是錯(cuò)誤網(wǎng)頁(yè)的URL。在一個(gè)錯(cuò)誤網(wǎng)頁(yè)已經(jīng)裝入時(shí),通過檢查瀏覽器地址欄中的URL,可以對(duì)此進(jìn)行確認(rèn)。但是在原網(wǎng)如果原ASP網(wǎng)頁(yè)正在一個(gè)事務(wù)內(nèi)運(yùn)行,即在網(wǎng)頁(yè)的最前面包含有一個(gè)<%@TRANSACTION指令,也應(yīng)該確定是否需要在網(wǎng)頁(yè)中采取一些方法,以退出該事務(wù)。使用ASPError對(duì)象的關(guān)于使用ASPError對(duì)象的屬性,有以下幾點(diǎn)值得注意即使沒有出現(xiàn)錯(cuò)誤,Number屬性應(yīng)該一直有一個(gè)值。如果ASP網(wǎng)頁(yè)調(diào)用GetLastError方法時(shí)沒有錯(cuò)誤出現(xiàn),該屬性的值是0。通常情況下,對(duì)ASP的運(yùn)行期錯(cuò)誤,NumberSubscriptoutofRange”錯(cuò)誤的返回值為“0x800A0009”,因?yàn)閂BScript對(duì)該類型錯(cuò)誤的錯(cuò)誤代碼是“9”。當(dāng)出現(xiàn)已經(jīng)過一個(gè)錯(cuò)誤時(shí),Category和Description屬性將一直有一個(gè)值A(chǔ)SPCode屬性的值由IIS產(chǎn)生,對(duì)大多數(shù)錯(cuò)誤將為空。情況下,涉及外部組件使用出錯(cuò)時(shí)有相應(yīng)的值。ASPDescription屬性的值由ASP預(yù)處理程序產(chǎn)生,而不是由當(dāng)前正在使用的引擎產(chǎn)生的,并且對(duì)大多數(shù)錯(cuò)誤而言將是空的。情況下,對(duì)諸如對(duì)ASP內(nèi)置對(duì)象調(diào)用無效的方法的錯(cuò)誤有相應(yīng)的值。File、Source、Line和column屬性僅在錯(cuò)誤出現(xiàn)時(shí),并且在錯(cuò)誤的詳細(xì)數(shù)據(jù)是可用的情況下才能進(jìn)行設(shè)置。對(duì)一個(gè)運(yùn)行期錯(cuò)誤,F(xiàn)ile和Linecolumn屬性經(jīng)常返回-1。當(dāng)錯(cuò)誤是一個(gè)頁(yè)面被ASP回Source屬性。一Line和Column屬性是有效的。如果把Source屬性的值寫到頁(yè)面,明智的辦法是先將該值傳給HTMLEncode,以防在其含有的HTML字符。在本章的后面詳細(xì)將地討論HTMLEncode方法。獲取Server對(duì)象的路徑信在對(duì)在eb上的文件進(jìn)行操作時(shí),需要獲得文件的實(shí)際的物理路徑,而不是使用虛擬路徑或URL,盡管在其他網(wǎng)頁(yè)中能用它們正常地定位文件。下一章中有一個(gè)例子,它使用FileSystemObject對(duì)eb站點(diǎn)的InetPub\WWWRoo文件夾中的文件進(jìn)行讀寫。當(dāng)創(chuàng)建自己的定制組件或使商業(yè)化組對(duì)文件統(tǒng)行,常需要其供一個(gè)件物理路。Server對(duì)象的MapPath可以從Request.ServerVariables集合中提取HTTP報(bào)頭變量,它們包含了當(dāng)前文件的物徑(在 _NAME和PTH_TRANSLATED報(bào)頭中)。Server對(duì)象提供了一個(gè)方法MapPath,可以使用這個(gè)方法對(duì)我們能夠提供一個(gè)有效的虛擬路徑的任何文件提取相應(yīng)的物理用MapPath方法,并可試驗(yàn)使用該方法。4-24所示,在頁(yè)面的底部的MiscellaneousMethods部分,有一個(gè)按鈕執(zhí)行Server.MapPath方法,并提供給它靠近該按鈕的文本框中的值。在該網(wǎng)頁(yè)的源代碼中已經(jīng)把這個(gè)值設(shè)置為“/lishelp/default.htm頁(yè)的URL。圖4- 使用Server.MapPath的屏單擊該按鈕重新裝載這個(gè)網(wǎng)頁(yè),執(zhí)行該方法并在頂部顯示結(jié)果,在下部顯示原頁(yè)面的其余部分,如圖4-24示例網(wǎng)頁(yè)代碼的功
圖4- 顯示Server.MapPath的結(jié)在該頁(yè)面頂部的ASP區(qū)域中,對(duì)單擊的按鈕的名字進(jìn)行檢查。在這種情況下,該按鈕的名字將是cmdMapPath,簡(jiǎn)單地把相匹配的文本框中的值txtMapPath傳送給Server.MapPath方法,并顯示得到的結(jié)果:MapPath和虛擬應(yīng)用程注意,MapPath方法為/iishelp/default.htm文件獲取的結(jié)果在Web服務(wù) 外,并在 的 中。這清楚地證明了MapPath方法是非常有用的對(duì)于在缺省的Web中的文件,其URL的路徑部分與物理路徑通常是相同的。例如,一個(gè)文件在Web服務(wù)器上:如果安裝時(shí)已經(jīng)在缺 中安裝了的Web ,則URL如下然而,IISHelp文件安裝在缺省Web根外的一個(gè)虛擬中,所以用于對(duì)其進(jìn)行的URL和物理路徑之間沒有直接的關(guān)聯(lián)。只有通過使用Server.MapPath方法才能獲取真實(shí)使用Server對(duì)象格式化數(shù)當(dāng)前面討論演示SSI指令的網(wǎng)頁(yè)的代碼時(shí),碰巧遇到了使用HTML的一個(gè)老問題。在一個(gè)HTML網(wǎng)頁(yè)中如何顯示HTML代碼?如果“照現(xiàn)在的樣子”使用,也就是在相應(yīng)的位置上使用所有的HTML字符,會(huì)被瀏覽器當(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)識(shí)語言)規(guī)則的,如HTML語言。數(shù)字的HTML實(shí)體等價(jià)字注意最后一個(gè)例子,已的商標(biāo)符號(hào)?是一個(gè)以“#”字符為前綴的數(shù)字值,而不是相應(yīng)含義的一個(gè)文本縮寫(如copy對(duì)應(yīng)符號(hào))。具有一個(gè)大于126的ANSI代碼值的所有字符事實(shí)上,需要留心的是使用數(shù)字實(shí)體等價(jià)字符串要優(yōu)先于一些較少被支持的文本實(shí)體字(),該字符的實(shí)體等價(jià)字符串為"™"但不是所有瀏覽器(例如Navigator)都能識(shí)別這個(gè)字符串,這種情況下,將在網(wǎng)頁(yè)中顯示該實(shí)體字符串。相反,使用在所有瀏覽器中都能很好地工作。Server對(duì)象的HTMLEncode把HTML轉(zhuǎn)換為文本是進(jìn)行有效顯示需要的,否 HTML會(huì)被瀏覽器當(dāng)成HTML來對(duì)待執(zhí)行,這意味著必須對(duì)無效的字符進(jìn)行編碼,使其成為等價(jià)的HTML實(shí)體字符串。為管理這種轉(zhuǎn)換,Server對(duì)象提供了HTMLEncode方法。可以在本書提供的ASPServerObject示例網(wǎng)頁(yè)中簡(jiǎn)單地把一些文本輸入到HTMLEncode對(duì)應(yīng)的文本框中并單擊按鈕。示例中提供了一些真實(shí)的HM作為缺省的文本,如圖4所示。圖4- 重新載入該頁(yè)面時(shí),在該頁(yè)面的頂部顯示結(jié)果。HTMLEncode方法把尖括號(hào)轉(zhuǎn)換成了“<;”和“>;”,而且把雙引號(hào)轉(zhuǎn)換成為“";”,如圖4-27所示。示例網(wǎng)頁(yè)代碼的功
圖4- 使用HTMLEncode方法首先,在方法名字后面的括號(hào)中已經(jīng)丟掉了<B>和</B>標(biāo)記,相應(yīng)增加了一個(gè)粗體文本部分。在網(wǎng)頁(yè)中顯示原有的值時(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é)果,又會(huì)發(fā)生什么情況?為了解決這個(gè)問題,要從HTMLEncod方法本身考慮:上面的語句在HTML網(wǎng)頁(yè)中得不到同樣的顯示結(jié)果,這是因?yàn)镠TML字符實(shí)體將被瀏覽器我們沒看到實(shí)體。為了避免這種情況,可兩次使用Server.HTNLEncode方法。這就把“&”HTMLEncode與HTML控件的缺省從上面可以看出,如果在一個(gè)HTML網(wǎng)頁(yè)中要顯示HTML代碼,而又不使之被作為HTMLHTNLEncodeASP網(wǎng)頁(yè)中不大
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年甘肅省張掖市肅南裕固風(fēng)情走廊旅游景區(qū)招聘22人筆試備考試題附答案
- 2025江蘇淮安市港城產(chǎn)業(yè)投資發(fā)展有限公司招聘12人筆試參考題庫(kù)附答案
- 2025廣東省陽(yáng)江市“百萬英才匯南粵”招聘醫(yī)療衛(wèi)生人才44人(廣州專場(chǎng))考試參考題庫(kù)附答案
- 2026重慶九龍坡區(qū)鐵馬小學(xué)校招聘3人筆試模擬試題及答案解析
- 2026云南保山市衛(wèi)生健康委員會(huì)招聘1名公益性崗位人員筆試備考試題及答案解析
- 海東市高鐵新區(qū)醫(yī)院招聘20人筆試模擬試題及答案解析
- 2025秋人教版道德與法治八年級(jí)上冊(cè)6.1樹立法治觀念課件
- 2026年常州紡織服裝職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試模擬試題帶答案解析
- 2026西安市陽(yáng)光中學(xué)招聘筆試參考題庫(kù)及答案解析
- 2026重慶飛駛特人力資源管理有限公司大足分公司外派至大足區(qū)經(jīng)濟(jì)和信息化委員會(huì)公益性崗位人員招聘筆試備考題庫(kù)及答案解析
- 農(nóng)貿(mào)市場(chǎng)保潔服務(wù) 投標(biāo)方案(技術(shù)標(biāo) )
- 合作的合同書模板
- 高壓氣瓶固定支耳加工工藝設(shè)計(jì)
- (正式版)FZ∕T 13061-2024 燈芯絨棉本色布
- 0.4kV配網(wǎng)不停電作業(yè)用工器具技術(shù)條件V11
- 滿腹經(jīng)綸相聲臺(tái)詞完整篇
- JGT138-2010 建筑玻璃點(diǎn)支承裝置
- 2023年10月自考05678金融法試題及答案含評(píng)分標(biāo)準(zhǔn)
- 新蘇教版六年級(jí)科學(xué)上冊(cè)第一單元《物質(zhì)的變化》全部教案
- 城鎮(zhèn)道路工程施工與質(zhì)量驗(yàn)收規(guī)范CJJ解析及質(zhì)量控制點(diǎn)
- 軟土路基處理工程CFG樁施工方案
評(píng)論
0/150
提交評(píng)論