Share via


追蹤

 

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物件現在是內建頁面物件,類似于RequestResponseServer等。其可直接使用我們的頁面代碼來存取。

讓我們簡短地看看 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類別支援兩個公用屬性:IsEnabledTraceMode

  • 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] "— 我們可以將啟用的選項設定為truefalse。 追蹤是在應用層級啟用,或在應用層級停用。 如果我們設定 enabled=false,則使用稍早討論的 Trace 指示詞仍支援頁面追蹤。
  • requestlimit = [int] "— 每個應用程式保留記憶體中快取的追蹤要求總數。 追蹤會公開特殊的資源:Trace.axd,我們將立即查看,這是用來在 pageoutput 設定為 false時檢視追蹤輸出。
  • pageoutput = [true/false] "—透過組態檔啟用追蹤時,系統管理員可以在每個頁面上啟用或停用追蹤。 pageoutput追蹤會啟用應用程式內每個頁面的追蹤詳細資料。 不過,當應用層級追蹤仍然啟用時,可能會關閉 pageoutput追蹤, (啟用 = " true ") 。 這會在記憶體中保留追蹤要求,使其可透過 trace.axd 取得,我們會立即查看,但不會顯示在頁面的輸出中。
  • tracemode = " [SortByTime |SortByCategory] "tracemode設定可讓我們控制追蹤詳細資料輸出的方式。 資料可以依時間或類別排序,其中類別會區分系統所做的設定,以及開發人員所啟用的 Trace.Write () 設定。 例如,在我們的範例中,我們使用下列專案:Trace.Write (" Inside Add () a:a.ToString ", () ) .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 () 所接受的兩個參數會分別當做 CategoryMessage 值使用。 此外,我們會提供從第一個到最後一個位元組的時間。
  • 控制樹狀結構:雖然此資料行尚未討論過,但 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 資源。

Rob Howard是.NET Framework小組上 ASP.NET 的程式經理。 他花任何閒置時間與家庭一起,或飛出美國東部華盛頓的釣魚。