相信大部分的人目前所用的ASP版本都是搭&;#36617;在IIS3.0或IIS4.0中的ASP2.0,伺服器平台也多是NT4.0,&;#38568;著WINDOWS 2000 即&;#23559;在二月十七&;#34399;&;#21839;世,由於之前&;#35377;多&;#38620;&;#35468;媒&;#39636;都曾&;#32147;&;#22577;&;#23566;&;#36942;有&;#38364;WINDOWS 2000在伺服器性能的&;#25844;充以及各版本(伺服器版本,&;#20491;人用&;#25142;版本....)的&;#31777;介,所以大家都迫不及待的想知道WINDOWS 2000到底多了哪些&;#24375;大的功能,身&;#28858;NT 伺服器使用者的我&;#20497;&;#30070;然也不可不知到底微&;#36575;在&;#36889;方面改善了多少?不&;#36942;由於本版面主要是在&;#35342;&;#35542;ASP的&;#25033;用,所以&;#31558;者&;#23559;&;#37341;&;#23565;搭&;#36617;在WINDOWS 2000中的ASP3.0和IIS5.0&;#33287;之前IIS3.0或IIS4.0中的ASP2.0有增加了哪些元件或者是&;#25844;充的&;#23660;性&;#33287;方法&;#20358;&;#35498;明,&;#32317;&;#39636;&;#20358;&;#35498;,ASP20.&;#33287;ASP3.0&;#20006;&;#27794;有&;#35377;多的不同,比&;#36611;引人注意的是新增了&;#20841;&;#20491;伺服器物件方法(METHOD)---SERVER.EXECUTE和SERVER.TRANSFER以及一&;#20491;新增加的物件--ASPERROR物件。
SERVER.TRANSFER方法
以往ASP2.0中控制&;#20841;&;#20491;&;#32178;&;#38913;之&;#38291;的&;#20659;&;#36958;大部分都是靠Response.Redirect&;#20358;完成,但是一般人可能不&;#26313;得Response.Redirect在&;#25033;用上&;#20358;&;#35498;是相&;#30070;笨拙的,在ASP&;#34389;理Response.Redirect&;#26178;是先&;#23559;一&;#20491;&;#35338;息&;#20659;&;#36958;至客&;#25142;端的&;#28687;&;#35261;器,告知客&;#25142;端的&;#28687;&;#35261;器&;#28310;&;#20633;&;#36617;入一&;#20491;新的&;#32178;址,客&;#25142;端&;#28687;&;#35261;器接收到&;#36889;&;#31558;&;#35338;息之後再回&;#20659;一&;#20491;&;#30906;&;#35469;新&;#32178;址&;#35338;息回伺服器端,然後伺服器端再&;#23559;客&;#25142;端&;#28687;&;#35261;器&;#23566;向到新的&;#32178;址,在&;#32178;路蓬勃&;#30332;展的今天,&;#36889;&;#27171;的做法&;#21218;必&;#26371;&;#23565;&;#32178;路的堵塞情形&;#24118;&;#20358;更大的&;#34909;&;#25802;,而&;#36889;也是使用者&;#33287;&;#32178;站管理者所不&;#27138;於&;#35211;到的,&;#28858;了取代Response.Redirect&;#36889;&;#20491;笨方法,ASP3.0加入了一&;#20491;新的伺服器方法--SERVER.TRANSFER,把Response.Redirect中客&;#25142;端&;#33287;伺服器端的&;#28317;通全部&;#36681;移到伺服器上,所有的&;#34389;理程序全部交由伺服器&;#20358;&;#22519;行,&;#30070;然啦!!在&;#35486;法&;#33287;&;#25033;用的&;#35264;念上&;#33287;Response.Redirect&;#20006;&;#28961;太大的分&;#21029;,在&;#32178;&;#38913;&;#33287;&;#32178;&;#38913;中&;#20659;&;#36958;&;#36039;&;#35338;&;#26178;,所有的&;#26178;域&;#35722;&;#25976;和&;#25033;用程式&;#35722;&;#25976;都&;#23559;保持不&;#35722;,看看下面的&;#35498;明:
[color=#FFFFFF'][/color]
&;#35486;法
SERVER.TRANSFER(PATH)
PATH所定&;#32681;的是&;#23559;控制&;#27402;&;#36681;移到的目的&;#32178;&;#38913;之&;#32178;址,跟Response.Redirect後面所接的
&;#21443;&;#25976;有&;#30064;曲同工之妙,&;#33289;例&;#20358;&;#35498;,
ASP1.asp如下:
<HTML>
<BODY>
<%
Response.Write Session.SessionID
Response.Write ("<BR>")
Response.Write("我要到下一&;#20491;&;#32178;&;#38913;去&;#22217;!! <BR>")
Server.Transfer("ASP2.asp")
%>
ASP2.asp如下
<HTML>
<BODY>
<%
Response.Write Session.SessionID
%>
ASP1.asp&;#22519;行&;#32080;果如下
一&;#20491;SessionID
我要到下一&;#20491;&;#32178;&;#38913;去&;#22217;!!
同&;#27171;的SessionID
很明&;#39023;的可以看出Response.Redirect&;#33287;SERVER.TRANSFER的不同了吧!!
SERVER.EXECUTE方法
SERVER.EXECUTE跟SERVER.TRANSFER相同的是都是在&;#36914;行Script&;#22519;行程序的&;#36681;移,唯一不同的是SERVER.TRANSFER最後&;#23559;控制&;#27402;交&;#32102;被呼叫的Script&;#27284;案,而SERVER.EXECUTE最後&;#23559;控制&;#27402;&;#36681;移&;#32102;被呼叫者本身,也就是&;#35498;&;#22519;行SERVER.EXECUTE的Script&;#27284;案&;#23559;被呼叫的Script&;#27284;案&;#35222;做自己本身的一部份,在&;#35264;念上&;#20358;&;#35498;,&;#33287;Include的做法是一&;#27171;的,&;#33287;&;#35377;多高&;#38542;&;#35486;言呼叫副程式的做法也相同,基本上伺服器端允&;#35377;SERVER.EXECUTE修改Http&;#27161;&;#38988;,但是如果被&;#22519;行的&;#27284;案企&;#22294;在&;#20659;送&;#35338;息至客&;#25142;端&;#28687;&;#35261;器之後修改Http&;#27161;&;#38988;就&;#26371;&;#30332;生已&;#23559; HTTP &;#27161;&;#38988;&;#23531;入用&;#25142;端&;#28687;&;#35261;器。&;#23565;任何 HTTP 的&;#27161;&;#38988;所做的修改必&;#38920;要在&;#23531;入&;#38913;&;#20839;容之前的&;#37679;&;#35492;。看看下面的&;#31684;例:
ASP1
<HTML>
<BODY>
<% Response.Write("你在看我&;#21966;? <BR>")
Server.Execute("asp2.asp")
%>
</BODY>
</HTML>
ASP2
<HTML>
<BODY>
<% Response.Write("你可以再近一&;#40670;。")%>
</BODY>
</HTML>
ASP1.asp&;#22519;行&;#32080;果&;#23559;&;#26371;是
你在看我&;#21966;?
你可以再近一&;#40670;。
看完了&;#36889;&;#20841;&;#20491;新增加的伺服器物件&;#23660;性之後,接下&;#20358;&;#35731;我&;#20497;看看新增加的ASP&;#20839;建元件--ASPERROR元件,&;#36889;是ASP3.0所提供的一&;#20491;全新的元件,他&;#35731;&;#32178;站管理者能完全掌控因ASP所&;#29986;生的&;#37679;&;#35492;,&;#36889;是前&;#24190;&;#20491;版本所&;#28961;法做到的,在前&;#24190;&;#20491;版本中要捕捉因ASP所&;#30332;生的&;#37679;&;#35492;是不可能的,&;#38914;多只能用VBScript的On Error Resume Next&;#20358;捕捉到因Script所&;#30332;生的&;#37679;&;#35492;,任何COM或ASP所&;#30332;生的&;#37679;&;#35492;都&;#28961;法捕捉,&;#38568;著ASP3.0的到&;#20358;,&;#36889;些&;#21839;&;#38988;都&;#23559;迎刃而解。
[color=#FFFFFF'][/color]
&;#28858;了要使用ASPERROR物件你必&;#38920;&;#26371;使用IIS的Http&;#37679;&;#35492;控制,不&;#26313;得大家&;#36914;我&;#20497;&;#32178;站之後有&;#27794;有&;#30332;&;#29694;,&;#30070;你在
www.pc-net.com.tw/&;#32178;址後&;#20098;打一些字然後再按Enter你&;#26371;&;#30332;&;#29694;&;#30070;&;#32178;址不存在&;#26178;&;#26371;出&;#29694;如下的&;#30059;面:
&;#36889;&;#20491;就叫做自定&;#37679;&;#35492;&;#38913;面,大家知道&;#36889;是如何做到的&;#21966;?打&;#38283;NT的IIS伺服器管理&;#21729;之後,在站台名&;#31281;之上&;#40670;&;#36984;滑鼠右&;#37749;,&;#36984;&;#25799;&;#20839;容(最下面的&;#36984;&;#38917;)你可以看到看看下面的&;#30059;面(由於&;#31558;者的工作平台是Window 98)所以只好藉由&;#28204;&;#35430;平台(英文版的NT&;#20358;&;#28858;大家做一&;#20491;&;#35498;明)。
你可以看到&;#35377;多的控制&;#36984;&;#38917;,&;#36984;&;#25799;右上角的Custom Errors(自定&;#37679;&;#35492;),然後&;#36984;取404&;#36889;&;#20491;&;#37679;&;#35492;,你&;#26371;看到在&;#20839;容部分&;#26371;有一&;#20491;路&;#24465;的描述C:\WINNT│help\common\404b.htm
&;#36889;&;#20491;&;#27284;案放置的&;#20839;容就是在描述&;#30070;所查&;#35426;的&;#32178;址不存在&;#26178;&;#26371;&;#30332;生的&;#37679;&;#35492;&;#35338;息,404b.htm的原始&;#27284;如下:
404b.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<style>
a:link {font:9pt/12pt 新&;#32048;明&;#39636;; color:red}
a:visited {font:9pt/12pt 新&;#32048;明&;#39636;; 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>
[color=#FFFFFF'][/color]
<table width="400" cellpadding="3" cellspacing="5">
<tr>
<td id="tableProps" valign="top" align="left"><img id="pagerrorImg" SRC="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 新&;#32048;明&;#39636;"><span id="errorText"><b>找不到&;#32178;&;#38913;</b></span></h1>
</td>
</tr>
<tr>
<td id="tablePropsWidth" width="400" colspan="2"><font
style="COLOR: black; FONT: 9pt/12pt 新&;#32048;明&;#39636;">查&;#35426;的&;#32178;&;#38913;可能已&;#32147;移除、&;#35722;更名&;#31281;或者&;#26283;&;#26178;&;#28961;法使用。</font></td>
</tr>
<tr>
<td id="tablePropsWidth2" width="400" colspan="2"><font id="LID1"
style="COLOR: black; FONT: 9pt/12pt 新&;#32048;明&;#39636;"><hr color="#C0C0C0" noshade>
<p id="LID2">&;#35531;&;#22039;&;#35430;下列:</p><ul>
[color=#FFFFFF'][/color]
<li id="list1">如果在&;#32178;址列&;#36664;入&;#32178;址,&;#35531;&;#30906;定未拼&;#37679;任何&;#36039;料。<br>
</li>
<li id="list2">&;#38283;&;#21855; <script> Homepage(); </script> 首&;#38913;,然後查&;#35426;您想索取之&;#36039;&;#35338;的&;#36899;&;#32080;。
</li>
<li id="list3">按<a href="javascript:history.back(1)"><img valign=bottom border=0 src="back.gif"> [上一&;#38913;] </a>按&;#37397;,移到其它&;#36899;&;#32080;。</li>
<li ID="list4">按一下<a href=""><img border=0 src="search.gif" width="16" height="16" alt="search.gif (114 位元&;#32068;)" align="center"> [搜&;#23563;] </a>&;#20358;&;#23563;找 Internet &;#36039;&;#35338;。 </li>
</ul>
<p><br>
</p>
<h2 id="ietext" style="font:9pt/12pt 新&;#32048;明&;#39636;; color:black">HTTP 404 - 找不到&;#27284;案<br>
Internet Explorer <BR>
</h2>
</font></td>
</tr>
</table>
</body>
</html>
一般未使用自定&;#37679;&;#35492;之前,你所&;#25033;&;#35442;看到的&;#30059;面&;#25033;&;#35442;如下&;#22294;所示
至於&;#34253;色那一段&;#32178;址超&;#36899;&;#32080;的部分是透&;#36942;404b.htm中Homepage()函&;#25976;&;#20358;解析所&;#29554;得的,要使用自己所定&;#32681;的&;#37679;&;#35492;&;#38913;面有&;#20841;&;#31278;方式可以完成,第一&;#31278;是直接&;#23559;自己所做的&;#37679;&;#35492;&;#38913;面存到C:\WINNT\help\common\404b.htm&;#35352;得&;#27284;名要取一&;#27171;,第二&;#20491;是&;#23559;&;#37679;&;#35492;&;#38913;面&;#20786;存到你想存放的目&;#37636;之下,然後直接修改站台&;#20839;容中自定&;#37679;&;#35492;&;#36984;&;#38917;中的&;#37679;&;#35492;&;#38913;面存放路&;#24465;,如下&;#22294;所示:
其中的
http://www.yourserver.com/404.htm就是以URL&;#28858;基&;#28310;的存放路&;#24465;。
在IIS4.0中我&;#20497;只能&;#22816;捕捉到404的&;#37679;&;#35492;&;#35338;息,但是IIS5.0&;#21371;能利用ASP程式捕捉伺服器&;#25033;用程式500和100&;#37679;&;#35492;(在&;#32232;&;#35695;或&;#22519;行ASP程式&;#26178;所&;#30332;生的&;#37679;&;#35492;)的&;#35338;息,&;#20006;在捕捉到&;#35338;息之後&;#22519;行你想&;#22519;行的ASP程式,譬如&;#23559;使用者&;#23566;向到某&;#20491;&;#32178;&;#38913;,&;#36889;&;#27171;的方式&;#35731;使用者不必再忍受一但&;#28687;&;#35261;&;#32178;路&;#26178;遭遇到&;#37679;&;#35492;而&;#28961;所&;#36969;&;#24478;的困境,因&;#28858;使用者多半不&;#26313;得&;#30332;生什&;#40636;事,如果透&;#36942;&;#32178;站管理&;#21729;告知使用者&;#23559;&;#26371;&;#35731;使用者&;#35258;得更&;#36028;心。
[color=#FFFFFF'][/color]
ASPERROR物件&;#35442;如何使用呢?基本上他必&;#38920;搭配SERVER物件的新方法GetLastError&;#20358;使用,因&;#28858;ASPERROR物件是透&;#36942;Server.GetLastError方法&;#20358;&;#20659;回&;#37679;&;#35492;&;#35338;息的。譬如&;#35498;你&;#23559;IIS5.0&;#35373;定成&;#30070;捕捉到伺服器&;#25033;用程式500或100&;#37679;&;#35492;&;#35338;息之後&;#23559;使用者&;#23566;向到Error.asp,&;#20006;利用Error.asp&;#20358;描述所&;#30332;生的&;#37679;&;#35492;,&;#35731;我&;#20497;看看Error.asp在做些什&;#40636;事。
Error.asp
<%
Dim objLastASPError
'建立伺服器物件(取得ASP所&;#29986;生的最後一&;#38917;&;#37679;&;#35492;)
Set objLastASPError = Server.GetLastError
'描述&;#37679;&;#35492;情&;#27841;
%>
伺服器遭遇如下的&;#37679;&;#35492;:<BR>
描述: <%=objLastASPError.Description%><BR>
&;#37679;&;#35492;&;#39006;&;#21029;: <%=objLastASPError.Category%><BR>
&;#30332;生&;#37679;&;#35492;的&;#27284;案: <%=objLastASPError.File%><BR>
元件&;#37679;&;#35492;&;#30908;: <%=objLastASPError.Number%><BR>
基本上ASPError物件&;#36996;有&;#35377;多&;#23660;性,而&;#36889;些&;#23660;性通通都是要靠建立伺服器物件,&;#20006;以伺服器物件中的GetLastError方法&;#20358;&;#20659;回&;#37679;&;#35492;&;#35338;息,&;#35731;我&;#20497;看看ASPError物件&;#36996;有哪些&;#23660;性:
ASPCODE:&;#20659;回IIS所&;#29986;生的&;#37679;&;#35492;&;#30908;
NUMBER:&;#20659;回COM物件所&;#29986;生的&;#37679;&;#35492;&;#30908;
SOURCE:&;#20659;回&;#29986;生&;#37679;&;#35492;的那段原始程式
CATEGORY:如果是ASP&;#20839;部&;#29986;生&;#37679;&;#35492;,那&;#26371;&;#20659;回是COM&;#36996;是手稿&;#35486;言的&;#37679;&;#35492;
FILE:&;#20659;回&;#29986;生&;#37679;&;#35492;的ASP&;#27284;案名&;#31281;
LINE:指出是哪一行程式&;#30332;生&;#37679;&;#35492;,&;#20659;回行&;#25976;
DESCRIPTION:&;#20659;回&;#31777;短&;#37679;&;#35492;&;#35338;息
ASPDESCRIPTION:&;#20659;回&;#35443;&;#32048;&;#37679;&;#35492;&;#35338;息
基本上&;#36889;就是IIS5.0中的ASP3.0和IIS4.0中的ASP2.0所不同之&;#34389;,&;#30070;然啦,&;#36996;有&;#35377;多小地方也改了,只是比&;#36611;不受人注意所以&;#27794;有&;#23531;出&;#20358;,像IIS4.0中Response.Buffer的&;#38928;&;#35373;值是False,若使用者需要再&;#23559;其&;#38283;&;#21855;,但是IIS5.0&;#28858;了提&;#26119;效能直接就&;#23559;&;#38928;&;#35373;值&;#35373;定&;#28858;True,奇怪,既然能提&;#26119;效能&;#28858;什&;#40636;IIS4.0要&;#23559;他&;#35373;定&;#28858;False,打&;#20491;&;#38651;&;#35441;去&;#21839;比&;#29246;吧!!我也不知道。