<%
Response.Write("A1 (原呼叫程式)<BR>")
Server.Execute "execute1b.asp"
Response.Write("A2 (原呼叫程式)<BR>")
%>
轉向後execute1b.asp只有一行顯示指令:
<% Response.Write("B1 (轉向後)<BR>") %>
執行結果,執行一行顯示指令後,再執行轉向後execute1b.asp顯示指令,仍然會繼續執行原呼叫程式Server.Execute下一行的指令。
若將execute1a.asp使用Response.Redirect指令改變為Server.Transfer指令,如下transfer1a.asp:
<%
Response.Write("A1 (原呼叫程式)<BR>")
Server.Transfer "execute1b.asp"
Response.Write("A2 (原呼叫程式)<BR>")
%>
則執行後,就不會執行Server.Transfer指令後的程式了。
Server.Transfer與Response.Redirect相異之處
雖然Server.Transfer與Response.Redirect都會轉向,但是Server.Transfer方法會將Session和Application變數值帶到轉向後之URL位址,Response.Redirect則不會。
譬如/iis5samp1/transfer2aa.asp設定Application("test")變數值後,使用Response.Redirect指令轉向到另一個網頁/iis5samp2/transfer2b.asp:
<%
Application("test") = "Transfer前的Application值"
Response.Redirect "/iis5samp2/transfer2b.asp"
%>
另一個網頁transfer2b.asp僅顯示Application("test")變數值:
<% Response.Write "Transfer後的Application值: " & Application("test") %>
因為轉向前的iis5samp1與轉向後的iis5samp2屬於不同的應用程式,因此iis5samp1應用程式的Application("test")變數值不會傳到iis5samp2應用程式,執行結果發現Application("test")為空的。
若將Response.Redirect指令改為使用Server.Transfer指令:
<%
Application("test") = "是Transfer前的Application值"
Server.Transfer "/iis5samp2/transfer2b.asp"
%>
則因Server.Transfer方法會將Session和Application變數值帶到轉向後之URL位址,因此轉向後執行結果Application("test")為轉向前程式所設定的值。
轉向前程式之Session和Application變數值是暫時帶到轉向後的程式,不會影響轉向後應用程式的Session和Application變數值。因此若再單獨執行轉向後的程式/iis5samp2/transfer2b.asp,並不會保留轉向前程式所帶來之Session和Application變數值。
Server.Execute與#include相異之處
雖然Server.Execute與#include指令都是於原程式當中包含另外一個網頁來執行,但是不一樣的地方是#include僅將所包含的程式插入原程式當中,而Server.Execute係單獨執行所包含的程式。
譬如include1a.asp使用#include指令包含另一個網頁include1b.asp,第一行加入@ Transaction=Required,表示整個網頁要有transaction功能:
<% @ Transaction=Required %>
<!-- #include file="include1b.asp" -->
<%
Sub OnTransactionCommit
Response.Write("原呼叫程式OnTransactionCommit副程式<BR>")
End Sub
Sub OnTransactionAbort
Response.Write("原呼叫程式OnTransactionAbort副程式<BR>")
End Sub
%>
包含網頁include1b.asp於第一行加入@ Transaction=Required,表示整個網頁也要有transaction功能,如下:
<% @ Transaction=Required %>
<% ObjectContext.SetAbort %>
因此#include僅將所包含的程式插入,造成兩行的@ Transaction=Required指令,因ASP內只可使用一次@命令,執行後將顯示錯誤。
Server.Execute與transaction關係
Server.Execute會將轉向後之URL位址之transaction結果(OnTransactionAbort和OnTransactionCommit),帶回原呼叫程式而影響其transaction結果。
譬如execute2a.asp使用Response.Redirect指令轉向到另一個網頁execute2b.asp,第一行加入@ Transaction=Required,表示整個網頁要有transaction功能:
<% @ Transaction=Required %>
<%
Server.Execute "execute2b.asp"
Sub OnTransactionCommit
Response.Write("原呼叫程式OnTransactionCommit副程式<BR>")
End Sub
Sub OnTransactionAbort
Response.Write("原呼叫程式OnTransactionAbort副程式<BR>")
End Sub
%>
轉向後execute2b.asp於第一行加入@ Transaction=Required,表示整個網頁也要有transaction功能,並加入一行ObjectContext.SetAbort強制放棄,如下:
<% @ Transaction=Required %>
<%
ObjectContext.SetAbort
Sub OnTransactionCommit
Response.Write("轉向後OnTransactionCommit副程式<BR>")
End Sub
Sub OnTransactionAbort
Response.Write("轉向後OnTransactionAbort副程式<BR>")
End Sub
%>
執行後,因轉向後execute2b.asp之transaction結果(ObjectContext.SetAbort強制放棄導致執行轉向後之OnTransactionAbort副程式),會帶回原呼叫程式execute2a.asp而影響其transaction結果,所以原呼叫程式也會執行其OnTransactionAbort副程式。
若移除轉向後execute2b.asp之ObjectContext.SetAbort程式成execute3b.asp,則轉向後execute3b.asp之transaction結果(執行OnTransactionCommit副程式),會帶回原呼叫程式execute3a.asp而影響其transaction結果,所以原呼叫程式也會執行其OnTransactionCommi副程式。
如何使用Server.GetLastError呢?
現在於IIS 5.0,可以使用新的Server.GetLastError方法來顯示有用的錯誤資訊。
譬如執行一個錯誤的ASP程式如下,其中nxt應該為Next:
<%
for i=1 to 1
nxt
%>
每當有錯誤發生時,IIS預設執行500-100.asp程式,此程式中相關ASP程式如下:
Set objASPError = Server.GetLastError
'Microsoft VBScript 編譯階段錯誤 (0x800A03FC)
Response.Write Server.HTMLEncode(objASPError.Category)
If objASPError.ASPCode > "" Then Response.Write Server.HTMLEncode(", " & objASPError.ASPCode)
Response.Write Server.HTMLEncode(" (0x" & Hex(objASPError.Number) & ")" ) & "<br>"
'必須要有 'Next'
If objASPError.ASPDescription > "" Then
Response.Write Server.HTMLEncode(objASPError.ASPDescription) & "<br>"
elseIf (objASPError.Description > "") Then
Response.Write Server.HTMLEncode(objASPError.Description) & "<br>"
end if
'/iis5samp/error1.asp, line 25
Response.Write Server.HTMLEncode(objASPError.File)
If objASPError.Line > 0 Then Response.Write ", line " & objASPError.Line
If objASPError.Column > 0 Then Response.Write ", column " & objASPError.Column
首先由Set objASPError = Server.GetLastError取得錯誤資訊,接著由以下屬性取得相關錯誤資訊,如下:
l objASPError.Category:Microsoft VBScript 編譯階段錯誤
l objASPError.Number:0x800A03FC
l objASPError.ASPDescription:必須要有 'Next'
l objASPError.File:/iis5samp/error1.asp
l objASPError.Line:25
您可以用您自訂的錯誤訊息 .asp 檔案來找出或顯示錯誤。
ASP如何支援Scriptlet呢?
ASP支援新指令技術Scriptlet(指令元件),您可以用VBScript或Jscript的語言(不需要使用Visual Basic、C++、或者Java語言來編寫程式)編寫Scriptlet,儲存成.sct副檔名,註冊為元件成後,即可當成COM元件(Component Object Model)般來呼叫使用。
Scriptlet可以從.asp檔案或其他COM來呼叫,呼叫方式與呼叫一般COM元件相同。
如何編寫Scriptlet呢?首先使用 [記事本] 輸入以下程式碼,定義兩個函數Add與Minus:
<SCRIPTLET>
<Registration Description="Scriptlet test" ProgID="test.scr1" Version="1.00">
</Registration>
<implements id=Automation type=Automation>
<method name=Add>
<PARAMETER name=A/>
<PARAMETER name=B/>
</method>
<method name=Minus>
<PARAMETER name=C/>
<PARAMETER name=D/>
</method>
</implements>
<SCRIPT LANGUAGE=VBScript>
Function Add(A, B)
Add = A - B
End Function
Function Minus(C, D)
Minus = C - D
End Function
</SCRIPT>
</SCRIPTLET>
接著將這個檔案儲存成.sct副檔名,然後於 [檔案總管] 中,在這個.sct檔案上按下滑鼠右鍵選取 [註冊]。
即可註冊為元件成功。
註冊成功後,asp程式如何呼叫此Scriptlet呢?asp程式使用Server.CreateObject("test.scr1")呼叫此Scriptlet後,即可使用所定義的兩個函數Add與Minus,asp程式SCRIPTLET1.ASP如下:
<%
Set obj1 = Server.CreateObject("test.scr1")
Response.Write "<BR>3 + 5 = " & obj1.Add(3,5)
Response.Write "<BR>10 - 5 = " & obj1.Minus(10,5)
%>
如何使用cookie取得瀏覽器資訊?
在以前的IIS版本,使用Browser Capabilities元件取得用戶端瀏覽器的功能資訊,方法為當瀏覽器連線到IIS時會自動傳送一個HTTP User Agent header,IIS收到後再與由其Browscap.ini對照表中找到此瀏覽器類型的詳細資訊。
ASP程式使用Browser Capabilities元件之方法,譬如browsertype1.asp:
<%
Set obj1 = Server.CreateObject("MSWC.BrowserType")
Response.Write "browser = " & obj1.browser & "<BR>"
Response.Write "version = " & obj1.version & "<BR>"
Response.Write "frames = " & obj1.frames & "<BR>"
Response.Write "tables = " & obj1.tables & "<BR>"
Response.Write "BackgroundSounds = " & obj1.BackgroundSounds & "<BR>"
Response.Write "vbscript = " & obj1.vbscript & "<BR>"
Response.Write "javascript = " & obj1.javascript & "<BR>"
Response.Write "platform = " & obj1.platform & "<BR>"
Response.Write "width = " & obj1.width & "<BR>"
Response.Write "height = " & obj1.height & "<BR>"
Response.Write "bufferDepth= " & obj1.bufferDepth & "<BR>"
Response.Write "colorDepth = " & obj1.colorDepth & "<BR>"
Response.Write "cookies = " & obj1.cookies & "<BR>"
%>
使用瀏覽器執行browsertype1.asp結果如下,顯示瀏覽器詳細資訊。
Browser Capabilities元件方法有些缺點,譬如Browscap.ini對照表可能為未更新,或使用者於用戶端瀏覽器更改了設定時,用戶端瀏覽器的功能資訊就可能抓錯。
現在於IIS 5.0,多了一項新的判斷瀏覽器功能方法,方法為使用cookie儲存於瀏覽器所偵測到的資訊傳回IIS,以後透過Browser Capabilities元件得知cookie回報的瀏覽器資訊。
首先於ASP程式cookie1.asp加一行:
<!--METADATA TYPE="Cookie" NAME="BrowsCap" SRC="cookie1.htm"-->
告訴瀏覽器先使用cookie1.htm中的DHTML語法偵測瀏覽器的資訊,傳回IIS後透過Browser Capabilities元件得知cookie回報的瀏覽器資訊:
<% Set obj1 = Server.CreateObject("MSWC.BrowserType") %>
<%
Response.Write "browser = " & obj1.browser & "<BR>"
Response.Write "version = " & obj1.version & "<BR>"
Response.Write "frames = " & obj1.frames & "<BR>"
Response.Write "tables = " & obj1.tables & "<BR>"
Response.Write "BackgroundSounds = " & obj1.BackgroundSounds & "<BR>"
Response.Write "vbscript = " & obj1.vbscript & "<BR>"
Response.Write "javascript = " & obj1.javascript & "<BR>"
Response.Write "platform = " & obj1.platform & "<BR>"
Response.Write "width = " & obj1.width & "<BR>"
Response.Write "height = " & obj1.height & "<BR>"
Response.Write "bufferDepth= " & obj1.bufferDepth & "<BR>"
Response.Write "colorDepth = " & obj1.colorDepth & "<BR>"
Response.Write "cookies = " & obj1.cookies & "<BR>"
%>
cookie1.htm中的DHTML語法偵測瀏覽器的資訊,如下:
<Script Language="JavaScript">
function window.onload ()
{
body1.style.behavior = "url(#default#clientCaps)";
bcString = "browse=" + body1.browser;
bcString += "&version=" + body1.version;
bcString += "&frames=" + body1.frames;
bcString += "&tables=" + body1.tables;
bcString += "&BackgroundSounds=" + body1.BackgroundSounds;
bcString += "&vbscript=" + body1.vbscript;
bcString += "&javascript=" + body1.javascript;
bcString += "&platform=" + body1.platform;
bcString += "&width=" + body1.width;
bcString += "&height=" + body1.height;
bcString += "&bufferDepth=" + body1.bufferDepth;
bcString += "&colorDepth=" + body1.colorDepth;
bcString += "&cookies=" + body1.cookieEnabled;
document.cookie = "BrowsCap = " + bcString;
}
</SCRIPT>
</HEAD>
<BODY ID="body1">
</BODY><HTML>
使用瀏覽器執行cookie1.asp結果如下,顯示瀏覽器詳細資訊。
WebFlow
筆者參予設計的WebFlow辦公室自動化流程系統軟體,也推出了Windows 2000版本,運用了Windows 2000的IIS 5.0、ADSI、COM+、Certificate Services等技術,有興趣的讀者可上網www.asp.com.tw下載試用。另外,探討IIS 5.0的新書「IIS 5.0超級網站速成班」也將出版。