追蹤
Rob Howard
Microsoft Corporation
2001 年 1 月 25 日
每當我在 ASP.NET 上提供簡報時,在示範新的追蹤功能時,一律會很有趣地watch物件。 對於已使用 ASP 建置解決方案的人員而言,追蹤是一個主旨!
在此月份的資料行中,我們將查看 ASP.NET 中的追蹤功能。 讓我們從討論 ASP、 Response.Write () 的常見追蹤技術開始。
使用 ASP 追蹤
如果您喜歡我,當您撰寫 ASP 應用程式的程式碼時,當您剖析程式碼的麻煩區段時,就會使用 Response.Write () 語句。
以下是一些虛擬程式碼,說明這一點:
<%
On Error Resume Next
Response.Write("About to do data access...")
Set objDB = Server.CreateObject("Custom.DataAccess")
objDB.Open("PersonalizationData")
user = objDB.Get("username")
Response.Write("Done calling data access. Value of username is:" + user)
%>
上述程式碼中的 Response.Write () 呼叫看起來應該相當熟悉,亦即,我們已收到程式程式碼為的錯誤。 錯誤不一定是應用程式或系統錯誤,例如載入物件的失敗,而是程式碼如預期般執行但未傳回預期值的編碼錯誤。
當然,我們也可以使用偵錯工具,但有時候取得追蹤輸出的速度會更快,以找出程式碼的作用,或只是讓我們知道程式碼的特定區段如何執行。
雖然 Repsonse.Write () 語句確實可讓您輕鬆地對應用程式進行偵錯,但它們會將不必要的程式碼導入應用程式,進而造成實際 Bug 中斷部署的應用程式。 例如,當我們忘記移除更彩色 的 Response.Write () 語句時,通常不會被視為好事,這可能會表達我們正處理的程式碼真實感。
當然,ASP.NET 支援 Response.Write () 語句的相同功能。 事實上,即使我們現在有追蹤功能,我仍然使用 Response.Write () 。 舊習慣很難中斷。
不過,我們都應該嘗試中斷這些舊習慣,因為新的追蹤功能提供我們 ASP:偵錯模式中不存在的專案。
使用 ASP.NET 進行追蹤
ASP.NET 的新追蹤功能可讓我們模擬 Response.Write () 語句,但不擔心在部署應用程式之前移除 語句。 相反地,假設撰寫與上述相同的程式碼,但不要使用 Response.Write () ,而是使用 Trace.Write () 。
Trace物件現在是內建頁面物件,類似于Request、Response、Server等。其可直接使用我們的頁面代碼來存取。
讓我們簡短地看看 Trace 類別。
Trace 類別
追蹤 會在 ASP.NET 網頁中公開為公用屬性。 當我們使用Trace屬性時,我們會使用System.Web命名空間中定義的TraceCoNtext類別實例。
Trace類別會公開兩個多載方法和兩個屬性。 這兩種方法 Warn()
,兩 Write(),
者都支援兩個相同的原型:
VB.NET
Public Sub [Warn | Write](category As String,
message As String,
errorInfo As Exception)
End Sub
Public Sub [Warn | Write](category As String,
message As String)
End Sub
C#
public void [Warn | Write](String category,
String message,
Exception errorInfo)
public void [Warn | Write](String category,
String message)
類別參數可用來識別要寫入訊息值的類別名稱。 當我們在下列範例中使用 Write () 方法時,這會變得更明顯。 Warn () 和Write () 在其多載方法中都支援的第三個參數是errorInfo。 這可讓我們將例外狀況詳細資料傳遞至追蹤系統。
屬性
TraceCoNtext類別支援兩個公用屬性:IsEnabled和TraceMode。
- IsEnabled 指出是否在頁面上或應用程式啟用追蹤。
- TraceMode 會設定或傳回追蹤所使用的排序模式。 當我們討論下列應用層級追蹤時,我們將探討如何設定追蹤模式。
既然我們已經瞭解 TraceCoNtext 類別所支援的類別和方法和屬性看起來的樣子,讓我們看看 Trace.Write () 的範例。
<Script runat=server>
Public Function Add(a As Integer, b As Integer) As Integer
Trace.Write("Inside Add() a: ", a.ToString())
Trace.Write("Inside Add() b: ", b.ToString())
return a + b
End Function
</Script>
Call the Add routine: 4 + 5 = <%=Add(4,5)%>
執行此程式碼時,輸出為:
圖 1. Trace.Write () 方法的範例
顯然正在呼叫 Add () 方法。 不過,與 Repsonse.Write () 語句不同, Trace.Write () 語句不會出現在產生的輸出中。 若要檢視 Trace.Write () 語句的結果,我們需要啟用此頁面或應用程式的追蹤。
若要啟用追蹤,我們可以使用頁面指示詞或組態選項。 讓我們看看這兩者。
頁面追蹤指示詞
頁面指示詞是處理 ASP.NET 資源要求時,ASP.NET 使用的特殊指示。 頁面指示詞可用來覆寫或套用 ASP.NET 網頁的組態設定。
指示詞必須是頁面上的第一個專案。 它會使用下列語法來宣告:
<%@ Directive Attribute="[Value]" %>
使用上述語法,以下說明如何告訴 ASP.NET 我們想要在頁面上啟用追蹤:
<%@ Page Trace="true" %>
如果我們將上述指示詞新增至我們的範例程式碼,頁面輸出看起來會有點不同:
圖 2. 已啟用追蹤
我們現在會取得新增至頁面底部的追蹤輸出。 追蹤輸出 一律 會在頁面結尾新增。
接下來,讓我們看看如何在應用層級啟用追蹤。 然後,我們將討論追蹤輸出所包含的內容。
應用程式追蹤
ASP.NET 會使用 XML 組態檔來設定 ASP.NET 應用程式的組態設定。 每個 ASP.NET 安裝都會在名為config.web的[系統磁片磁碟機]\WinNt\Microsoft.NET\Framework\[version]\目錄中安裝組態檔。
組態檔會設定預設 ASP.NET 組態,在 Beta 1 中稱為根組態檔。 此檔案中所做的變更會影響我們所有 ASP.NET Web 應用程式。 我們也可以使用 Web 應用程式中的組態檔來新增或移除從預設 config.web取得的設定。
我會在未來的資料行中更詳細地討論設定。 現在,我們將使用根組態檔來套用所有 ASP.NET 應用程式的追蹤設定。
追蹤區段
如果我們開啟根 config.web 檔案,我們會找到追蹤區段:
<configuration>
<trace
enabled="false"
requestlimit="10"
pageoutput="false"
tracemode="SortByTime"
/>
</configuration>
追蹤元素有四個屬性:
-
enabled =「[true/false]
"
— 我們可以將啟用的選項設定為true或false。 追蹤是在應用層級啟用,或在應用層級停用。 如果我們設定 enabled=false,則使用稍早討論的 Trace 指示詞仍支援頁面追蹤。 -
requestlimit =
"
— 每個應用程式保留記憶體中快取的追蹤要求總數。 追蹤會公開特殊的資源:Trace.axd,我們將立即查看,這是用來在 pageoutput 設定為 false時檢視追蹤輸出。 -
pageoutput =
"
—透過組態檔啟用追蹤時,系統管理員可以在每個頁面上啟用或停用追蹤。 pageoutput追蹤會啟用應用程式內每個頁面的追蹤詳細資料。 不過,當應用層級追蹤仍然啟用時,可能會關閉 pageoutput追蹤, (啟用= "
true"
) 。 這會在記憶體中保留追蹤要求,使其可透過 trace.axd 取得,我們會立即查看,但不會顯示在頁面的輸出中。 -
tracemode
= "
[SortByTime |SortByCategory]"
— tracemode設定可讓我們控制追蹤詳細資料輸出的方式。 資料可以依時間或類別排序,其中類別會區分系統所做的設定,以及開發人員所啟用的 Trace.Write () 設定。 例如,在我們的範例中,我們使用下列專案:Trace.Write ("
Inside",
() ).
Trace.Write () 語句的第一個參數是類別。 在此案例中,我們將類別"
定義為 Inside Add () a:"
。 如果我們依類別排序 (tracemode = 「SortByCategory"
) ,則會在追蹤輸出中的一般頁面函式呼叫之前排序這個專案。 另一方面,依時間排序會依呼叫所花費的時間量排序。
使用應用程式追蹤
使用上述相同的範例程式碼,我們可以移除頁面指示詞,並藉由修改追蹤 config.web 設定來啟用相同的功能。
<configuration>
<trace
enabled="true"
requestlimit="10"
pageoutput="true"
tracemode="SortByTime"
/>
</configuration>
我們現在可以呼叫範例應用程式、移除 Page 指示詞,並取得相同的輸出:
圖 3. 已啟用追蹤,沒有 Page 指示詞
但是,如果我們想要使用稍早所述的功能,我們會在其中啟用追蹤,但停用頁面上的輸出呢?
<configuration>
<trace
enabled="true"
requestlimit="10"
pageoutput="false"
tracemode="SortByTime"
/>
</configuration>
如果我們要求具有上述組態設定的範例應用程式,則不會取得追蹤輸出,不過仍會啟用追蹤。 若要檢視追蹤輸出,我們使用名為 trace.axd 的特殊應用程式。
Trace.axd
Trace.axd 是 Http 處理常式。 Http 處理常式是一種程式碼撰寫選項,可讓我們在最基本的層級處理要求/回應。 Http 處理常式相當於 ISAPI 延伸模組。 不過,不同于 ISAPI,可以使用任何 .NET 語言來撰寫它們。 我們將在稍後的資料行中更詳細地討論 Http 處理常式。
Trace.axd 是 Http 處理常式,可用來要求應用程式追蹤詳細資料。 要求時,我們會獲得最後 n 個要求的追蹤記錄;n 是由組態檔中的 requestlimit=「[int]」 所設定的值所決定。
若要使用 trace.axd,只要在對範例應用程式提出要求的相同應用程式目錄中要求 trace.axd:
圖 4. 應用程式追蹤要求
如您在螢幕擷取畫面中所見,我們會看到可檢視的追蹤清單。 這些追蹤檢視與追蹤會新增至頁面的詳細資料相同,而不會包含來自頁面的輸出:
圖 5. 要求詳細資料
既然我們已逐步解說如何設定及使用追蹤,讓我們來討論追蹤輸出。
解譯追蹤輸出
追蹤檢視提供的輸出,可透過 Trace.axd 或頁面上提供六個詳細資料區段:
- 要求詳細資料—這是基本資訊,例如會話識別碼、要求的時間、Http 要求類型和 Http 回應狀態碼。
- 追蹤資訊— 本節提供類別和訊息的資料表檢視。 如果我們在程式碼中使用 Trace.Write () 語句, Trace.Write () 所接受的兩個參數會分別當做 Category 和 Message 值使用。 此外,我們會提供從第一個到最後一個位元組的時間。
- 控制樹狀結構:雖然此資料行尚未討論過,但 ASP.NET 使用伺服器控制項來允許我們以宣告方式建置應用程式。 [控制項樹狀結構] 區段會提供頁面內控制項的相關資訊。 我們提供控制項的識別碼、類型、轉譯大小和檢視狀態大小。 此資訊可讓我們瞭解我們所使用的控制項,以及轉譯大小和 viewstate (相關聯的成本) 。
- Cookie 集合— 會剖析用戶端在要求標頭中傳送的任何 Cookie,以及顯示其名稱、值和大小。
- 標頭集合-本節提供用戶端對伺服器的 Http 標頭。 這是列出名稱/值的簡單資料表。
- 伺服器變數— 伺服器變數區段會顯示伺服器變數的名稱/值組資料表。
使用追蹤
如您所見,追蹤是功能強大的新 ASP.NET 功能,專為開發 Web 應用程式而設計。 不過,我認為當您應該且不應該使用追蹤時,也值得提及。
已部署的應用程式
追蹤會增加要求的額外負荷,且不應針對已部署的應用程式啟用。 不過,Trace.Write () 語句可以留在中,因為它們在未啟用追蹤時會被忽略。
對於我們想要擷取資料的已部署應用程式,我建議使用 System.Diagnostics 命名空間中找到的類別。 我將會嘗試在未來的資料行中涵蓋這些類別,讓我們直接寫入 Windows 事件記錄檔。
當我們建置應用程式時,我們絕對應該使用追蹤,但在準備好部署應用程式時加以停用,就如同我們已移除這些 Response.Write () 語句一樣。
停用 Trace.axd
如果您已在生產 Web 服務器上安裝 ASP.NET,建議您明確地停用 Trace.axd。 開啟根config.web檔案、尋找 區 <httphandlers
> 段,然後新增下列專案:
<configuration>
<add verb="*"
path="trace.axd"
type="System.Web.Handlers.TraceHandler" />
<remove verb="*" path="trace.axd"/>
</configuration>
注意:我們也可以剪下整個 <add/
> 專案,但 <remove
> 選項比較好,因為它會將程式碼保留在組態檔中,並完成相同的目標,停用 trace.axd。 這將會在 ASP.NET 的 Beta 2 中解決。
總結
ASP.NET 中的追蹤功能是追蹤應用程式執行動作的強大新方式。 在過去,我們使用 Response.Write () 語句在應用程式執行時追蹤應用程式,但現在可以使用 Trace.Write () 語句,並將這些語句保留在已部署的程式碼中。 這會導致錯誤較少,因為我們尚未在準備好部署應用程式時移除程式碼。
ASP.NET 資源
最後,我想要呼叫一些可用的新 ASP.NET 資源。 請造訪 https://www.asp.net 以深入瞭解 ASP.NET 資源。
- Eraserver.net 提供裝載給 ASP.NET。
Rob Howard是.NET Framework小組上 ASP.NET 的程式經理。 他花任何閒置時間與家庭一起,或飛出美國東部華盛頓的釣魚。