WINDOWS 2000搭載ASP3.0與IIS5.0
發(fā)表時(shí)間:2024-06-13 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]相信大部分的人目前所用的ASP版本都是搭載在IIS3.0或IIS4.0中的ASP2.0,伺服器平臺(tái)也多是NT4.0,隨著WINDOWS 2000 即將在二月十七號(hào)問(wèn)世,由於之前許多雜誌媒體都曾經(jīng)報(bào)導(dǎo)過(guò)有關(guān)WINDOWS 2000在伺服器性能的擴(kuò)充以及各版本(伺服器版本,個(gè)人用戶版本...
相信大部分的人目前所用的ASP版本都是搭載在IIS3.0或IIS4.0中的ASP2.0,伺服器平臺(tái)也多是NT4.0,隨著WINDOWS 2000 即將在二月十七號(hào)問(wèn)世,由於之前許多雜誌媒體都曾經(jīng)報(bào)導(dǎo)過(guò)有關(guān)WINDOWS 2000在伺服器性能的擴(kuò)充以及各版本(伺服器版本,個(gè)人用戶版本....)的簡(jiǎn)介,所以大家都迫不及待的想知道WINDOWS 2000到底多了哪些強(qiáng)大的功能,身為NT 伺服器使用者的我們當(dāng)然也不可不知到底微軟在這方面改善了多少?不過(guò)由於本版面主要是在討論ASP的應(yīng)用,所以筆者將針對(duì)搭載在WINDOWS 2000中的ASP3.0和IIS5.0與之前IIS3.0或IIS4.0中的ASP2.0有增加了哪些元件或者是擴(kuò)充的屬性與方法來(lái)說(shuō)明,總體來(lái)說(shuō),ASP20.與ASP3.0並沒(méi)有許多的不同,比較引人注意的是新增了兩個(gè)伺服器物件方法(METHOD)---SERVER.EXECUTE和SERVER.TRANSFER以及一個(gè)新增加的物件--ASPERROR物件。
SERVER.TRANSFER方法
以往ASP2.0中控制兩個(gè)網(wǎng)頁(yè)之間的傳遞大部分都是靠Response.Redirect來(lái)完成,但是一般人可能不曉得Response.Redirect在應(yīng)用上來(lái)說(shuō)是相當(dāng)笨拙的,在ASP處理Response.Redirect時(shí)是先將一個(gè)訊息傳遞至客戶端的瀏覽器,告知客戶端的瀏覽器準(zhǔn)備載入一個(gè)新的網(wǎng)址,客戶端瀏覽器接收到這筆訊息之後再回傳一個(gè)確認(rèn)新網(wǎng)址訊息回伺服器端,然後伺服器端再將客戶端瀏覽器導(dǎo)向到新的網(wǎng)址,在網(wǎng)路蓬勃發(fā)展的今天,這樣的做法勢(shì)必會(huì)對(duì)網(wǎng)路的堵塞情形帶來(lái)更大的衝擊,而這也是使用者與網(wǎng)站管理者所不樂(lè)於見(jiàn)到的,為了取代Response.Redirect這個(gè)笨方法,ASP3.0加入了一個(gè)新的伺服器方法--SERVER.TRANSFER,把Response.Redirect中客戶端與伺服器端的溝通全部轉(zhuǎn)移到伺服器上,所有的處理程序全部交由伺服器來(lái)執(zhí)行,當(dāng)然啦!!在語(yǔ)法與應(yīng)用的觀念上與Response.Redirect並無(wú)太大的分別,在網(wǎng)頁(yè)與網(wǎng)頁(yè)中傳遞資訊時(shí),所有的時(shí)域變數(shù)和應(yīng)用程式變數(shù)都將保持不變,看看下面的說(shuō)明:
語(yǔ)法
SERVER.TRANSFER(PATH)
PATH所定義的是將控制權(quán)轉(zhuǎn)移到的目的網(wǎng)頁(yè)之網(wǎng)址,跟Response.Redirect後面所接的
參數(shù)有異曲同工之妙,舉例來(lái)說(shuō),
ASP1.asp如下:
<HTML>
<BODY>
<%
Response.Write Session.SessionID
Response.Write ("<BR>")
Response.Write("我要到下一個(gè)網(wǎng)頁(yè)去囉!! <BR>")
Server.Transfer("ASP2.asp")
%>
ASP2.asp如下
<HTML>
<BODY>
<%
Response.Write Session.SessionID
%>
ASP1.asp執(zhí)行結(jié)果如下
一個(gè)SessionID
我要到下一個(gè)網(wǎng)頁(yè)去囉!!
同樣的SessionID
很明顯的可以看出Response.Redirect與SERVER.TRANSFER的不同了吧!!
SERVER.EXECUTE方法
SERVER.EXECUTE跟SERVER.TRANSFER相同的是都是在進(jìn)行Script執(zhí)行程序的轉(zhuǎn)移,唯一不同的是SERVER.TRANSFER最後將控制權(quán)交給被呼叫的Script檔案,而SERVER.EXECUTE最後將控制權(quán)轉(zhuǎn)移給被呼叫者本身,也就是說(shuō)執(zhí)行SERVER.EXECUTE的Script檔案將被呼叫的Script檔案視做自己本身的一部份,在觀念上來(lái)說(shuō),與Include的做法是一樣的,與許多高階語(yǔ)言呼叫副程式的做法也相同,基本上伺服器端允許SERVER.EXECUTE修改Http標(biāo)題,但是如果被執(zhí)行的檔案企圖在傳送訊息至客戶端瀏覽器之後修改Http標(biāo)題就會(huì)發(fā)生已將 HTTP 標(biāo)題寫入用戶端瀏覽器。對(duì)任何 HTTP 的標(biāo)題所做的修改必須要在寫入頁(yè)內(nèi)容之前的錯(cuò)誤。看看下面的範(fàn)例:
ASP1
<HTML>
<BODY>
<% Response.Write("你在看我嗎? <BR>")
Server.Execute("asp2.asp")
%>
</BODY>
</HTML>
ASP2
<HTML>
<BODY>
<% Response.Write("你可以再近一點(diǎn)。")%>
</BODY>
</HTML>
ASP1.asp執(zhí)行結(jié)果將會(huì)是
你在看我嗎?
你可以再近一點(diǎn)。
看完了這兩個(gè)新增加的伺服器物件屬性之後,接下來(lái)讓我們看看新增加的ASP內(nèi)建元件--ASPERROR元件,這是ASP3.0所提供的一個(gè)全新的元件,他讓網(wǎng)站管理者能完全掌控因ASP所產(chǎn)生的錯(cuò)誤,這是前幾個(gè)版本所無(wú)法做到的,在前幾個(gè)版本中要捕捉因ASP所發(fā)生的錯(cuò)誤是不可能的,頂多只能用VBScript的On Error Resume Next來(lái)捕捉到因Script所發(fā)生的錯(cuò)誤,任何COM或ASP所發(fā)生的錯(cuò)誤都無(wú)法捕捉,隨著ASP3.0的到來(lái),這些問(wèn)題都將迎刃而解。
為了要使用ASPERROR物件你必須會(huì)使用IIS的Http錯(cuò)誤控制,不曉得大家進(jìn)我們網(wǎng)站之後有沒(méi)有發(fā)現(xiàn),當(dāng)你在www.pc-net.com.tw/網(wǎng)址後亂打一些字然後再按Enter你會(huì)發(fā)現(xiàn)當(dāng)網(wǎng)址不存在時(shí)會(huì)出現(xiàn)如下的畫面:
這個(gè)就叫做自定錯(cuò)誤頁(yè)面,大家知道這是如何做到的嗎?打開(kāi)NT的IIS伺服器管理員之後,在站臺(tái)名稱之上點(diǎn)選滑鼠右鍵,選擇內(nèi)容(最下面的選項(xiàng))你可以看到看看下面的畫面(由於筆者的工作平臺(tái)是Window 98)所以只好藉由測(cè)試平臺(tái)(英文版的NT來(lái)為大家做一個(gè)說(shuō)明)。
你可以看到許多的控制選項(xiàng),選擇右上角的Custom Errors(自定錯(cuò)誤),然後選取404這個(gè)錯(cuò)誤,你會(huì)看到在內(nèi)容部分會(huì)有一個(gè)路徑的描述C:\WINNT help\common\404b.htm
這個(gè)檔案放置的內(nèi)容就是在描述當(dāng)所查詢的網(wǎng)址不存在時(shí)會(huì)發(fā)生的錯(cuò)誤訊息,404b.htm的原始檔如下:
404b.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<style>
a:link {font:9pt/12pt 新細(xì)明體; color:red}
a:visited {font:9pt/12pt 新細(xì)明體; color:#4e4e4e}
</style>
<meta HTTP-EQUIV="Content-Type" Content="text-html; charset=big5">
<title>HTTP 404 找不到</title>
</head>
<script>
function Homepage(){
// in real bits, urls get returned to our script like this:
// res://shdocvw.dll/http_404.htm#http://www.DocURL.com/bar.htm
//For testing use DocURL = "res://shdocvw.dll/http_404.htm#https://www.microsoft.com/bar.htm"
DocURL = document.location.href;
//this is where the http or https will be, as found by searching for :// but skipping the res://
protocolIndex=DocURL.indexOf("://",4);
//this finds the ending slash for the domain server
serverIndex=DocURL.indexOf("/",protocolIndex + 3);
//for the href, we need a valid URL to the domain. We search for the # symbol to find the beginning
//of the true URL, and add 1 to skip it - this is the BeginURL value. We use serverIndex as the end marker.
//urlresult=DocURL.substring(protocolIndex - 4,serverIndex);
BeginURL=DocURL.indexOf("#",1) + 1;
if (protocolIndex - BeginURL > 7)
urlresult=""
urlresult=DocURL.substring(BeginURL,serverIndex);
//for display, we need to skip after http://, and go to the next slash
displayresult=DocURL.substring(protocolIndex + 3 ,serverIndex);
// Security precaution: must filter out "urlResult" and "displayresult"
forbiddenChars = new RegExp("[<>\'\"]", "g"); // Global search/replace
urlresult = urlresult.replace(forbiddenChars, "");
displayresult = displayresult.replace(forbiddenChars, "");
document.write('<A target=_top HREF="' + urlresult + '">' + displayresult + "</a>");
}
</script>
<body bgcolor="white">
<object id=saOC CLASSID='clsid:B45FF030-4447-11D2-85DE-00C04FA35C89' HEIGHT=0 width=0></object>
<table width="400" cellpadding="3" cellspacing="5">
<tr>
<td id="tableProps" valign="top" align="left"><img id="pagerrorImg" SRC=http://www.okasp.com/techinfo/"pagerror.gif"
width="25" height="33"></td>
<td id="tableProps2" align="left" valign="middle" width="360"><h1 id="errortype"
style="COLOR: black; FONT: 12pt/15pt 新細(xì)明體"><span id="errorText"><b>找不到網(wǎng)頁(yè)</b></span></h1>
</td>
</tr>
<tr>
<td id="tablePropsWidth" width="400" colspan="2"><font
style="COLOR: black; FONT: 9pt/12pt 新細(xì)明體">查詢的網(wǎng)頁(yè)可能已經(jīng)移除、變更名稱或者暫時(shí)無(wú)法使用。</font></td>
</tr>
<tr>
<td id="tablePropsWidth2" width="400" colspan="2"><font id="LID1"
style="COLOR: black; FONT: 9pt/12pt 新細(xì)明體"><hr color="#C0C0C0" noshade>
<p id="LID2">請(qǐng)嘗試下列:</p><ul>
<li id="list1">如果在網(wǎng)址列輸入網(wǎng)址,請(qǐng)確定未拼錯(cuò)任何資料。<br>
</li>
<li id="list2">開(kāi)啟 <script> Homepage(); </script> 首頁(yè),然後查詢您想索取之資訊的連結(jié)。
</li>
<li id="list3">按<a href="
javascript:history.back(1)"><img valign=bottom border=0 src=http://www.okasp.com/techinfo/"back.gif"> [上一頁(yè)] </a>按鈕,移到其它連結(jié)。</li>
<li ID="list4">按一下<a onclick="saOC.NavigateToDefaultSearch();event.returnValue=false" href=""><img border=0 src=http://www.okasp.com/techinfo/"search.gif" width="16" height="16" alt=http://www.okasp.com/techinfo/"search.gif (114 位元組)" align="center"> [搜尋] </a>來(lái)尋找 Internet 資訊。 </li>
</ul>
<p><br>
</p>
<h2 id="ietext" style="font:9pt/12pt 新細(xì)明體; color:black">HTTP 404 - 找不到檔案<br>
Internet Explorer <BR>
</h2>
</font></td>
</tr>
</table>
</body>
</html>
一般未使用自定錯(cuò)誤之前,你所應(yīng)該看到的畫面應(yīng)該如下圖所示
至於藍(lán)色那一段網(wǎng)址超連結(jié)的部分是透過(guò)404b.htm中Homepage()函數(shù)來(lái)解析所獲得的,要使用自己所定義的錯(cuò)誤頁(yè)面有兩種方式可以完成,第一種是直接將自己所做的錯(cuò)誤頁(yè)面存到C:\WINNT\help\common\404b.htm記得檔名要取一樣,第二個(gè)是將錯(cuò)誤頁(yè)面儲(chǔ)存到你想存放的目錄之下,然後直接修改站臺(tái)內(nèi)容中自定錯(cuò)誤選項(xiàng)中的錯(cuò)誤頁(yè)面存放路徑,如下圖所示:
其中的http://www.yourserver.com/404.htm就是以URL為基準(zhǔn)的存放路徑。
在IIS4.0中我們只能夠捕捉到404的錯(cuò)誤訊息,但是IIS5.0卻能利用ASP程式捕捉伺服器應(yīng)用程式500和100錯(cuò)誤(在編譯或執(zhí)行ASP程式時(shí)所發(fā)生的錯(cuò)誤)的訊息,並在捕捉到訊息之後執(zhí)行你想執(zhí)行的ASP程式,譬如將使用者導(dǎo)向到某個(gè)網(wǎng)頁(yè),這樣的方式讓使用者不必再忍受一但瀏覽網(wǎng)路時(shí)遭遇到錯(cuò)誤而無(wú)所適從的困境,因?yàn)槭褂谜叨喟氩粫缘冒l(fā)生什麼事,如果透過(guò)網(wǎng)站管理員告知使用者將會(huì)讓使用者覺(jué)得更貼心。
ASPERROR物件該如何使用呢?基本上他必須搭配SERVER物件的新方法GetLastError來(lái)使用,因?yàn)锳SPERROR物件是透過(guò)Server.GetLastError方法來(lái)傳回錯(cuò)誤訊息的。譬如說(shuō)你將IIS5.0設(shè)定成當(dāng)捕捉到伺服器應(yīng)用程式500或100錯(cuò)誤訊息之後將使用者導(dǎo)向到Error.asp,並利用Error.asp來(lái)描述所發(fā)生的錯(cuò)誤,讓我們看看Error.asp在做些什麼事。
Error.asp
<%
Dim objLastASPError
'建立伺服器物件(取得ASP所產(chǎn)生的最後一項(xiàng)錯(cuò)誤)
Set objLastASPError = Server.GetLastError
'描述錯(cuò)誤情況
%>
伺服器遭遇如下的錯(cuò)誤:<BR>
描述: <%=objLastASPError.Description%><BR>
錯(cuò)誤類別: <%=objLastASPError.Category%><BR>
發(fā)生錯(cuò)誤的檔案: <%=objLastASPError.File%><BR>
元件錯(cuò)誤碼: <%=objLastASPError.Number%><BR>
基本上ASPError物件還有許多屬性,而這些屬性通通都是要靠建立伺服器物件,並以伺服器物件中的GetLastError方法來(lái)傳回錯(cuò)誤訊息,讓我們看看ASPError物件還有哪些屬性:
ASPCODE:傳回IIS所產(chǎn)生的錯(cuò)誤碼
NUMBER:傳回COM物件所產(chǎn)生的錯(cuò)誤碼
SOURCE:傳回產(chǎn)生錯(cuò)誤的那段原始程式
CATEGORY:如果是ASP內(nèi)部產(chǎn)生錯(cuò)誤,那會(huì)傳回是COM還是手稿語(yǔ)言的錯(cuò)誤
FILE:傳回產(chǎn)生錯(cuò)誤的ASP檔案名稱
LINE:指出是哪一行程式發(fā)生錯(cuò)誤,傳回行數(shù)
DESCRIPTION:傳回簡(jiǎn)短錯(cuò)誤訊息
ASPDESCRIPTION:傳回詳細(xì)錯(cuò)誤訊息
基本上這就是IIS5.0中的ASP3.0和IIS4.0中的ASP2.0所不同之處,當(dāng)然啦,還有許多小地方也改了,只是比較不受人注意所以沒(méi)有寫出來(lái),像IIS4.0中Response.Buffer的預(yù)設(shè)值是False,若使用者需要再將其開(kāi)啟,但是IIS5.0為了提昇效能直接就將預(yù)設(shè)值設(shè)定為True,奇怪,既然能提昇效能為什麼IIS4.0要將他設(shè)定為False,打個(gè)電話去問(wèn)比爾吧!!我也不知道。