以前使用ASP開發過Web應用程式的人員肯定知道調試Web應用程式是多麼麻煩。在ASP中,調試是痛苦的,通常包括了使用Response.Write()方法輸出變數的值。那麼請問一下自己:你有多少次忘記了在布署應用程式之前刪除了調試語句? 隨著.NET架構組件的出現這種情況發生了徹底的改變。在.NET中,你可以使用Visual Studio .NET中的偵錯工具跟蹤整個Web應用程式的執行,或者使用System.Web.TraceContext名字空間中的Trace類。本文示範如何使用Trace類輔助你的調試工作。 使用Trace類 ASP.NET中包含了一個協助跟蹤應用程式資訊流的Trace類。作為使用Response對象進行調試的代替,你現在可以使用Trace類列印出調試資訊了。 為了示範它的使用,我們首先建立一個ASP.NET Web應用程式,並在預設的WebForm1上放置一個Button和一個ListBox控制項(1所示)。用三個項填充ListBox控制項並把它的AutoPostBack屬性設定為True。 圖1.填充預設的WebForm1 |
對於本文,我希望跟蹤應用程式的執行流。首先,啟用跟蹤,頁面指令要求含有Trace屬性,它的值設定為True(切換到查看HTML源模式),2所示。
下一步,我在Form的load事件中插入Trace語句,這樣我就知道是否發生了Postback。PostBack事件是ASP.NET中的最容易混亂的一個特性,它經常導致初用ASP.NET的開發人員的失敗。
Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load '此處放置初始化頁面的使用者代碼 Trace.Write("Page loaded") If Not IsPostBack Then Trace.Write("Not in a postback") ' postback發生的時候執行一些操作 Else Trace.Write("In a postback") ' 執行一些操作 End If End Sub |
我同樣想知道當ListBox資料項目被選擇的時候是否發生了postback:
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As _ System.Object, _ ByVal e As System.EventArgs) Handles _ ListBox1.SelectedIndexChanged Trace.Write("Listbox postback") End Sub |
當上面的ASP.NET應用程式執行時,將顯示下面的輸出結果(圖3所示):
你可以發現,當第一次載入WebForm1的時候,你可以看到字串"Page loaded"和"Not in a postback"。如果你點擊WebForm1上的按鈕,你可以看到圖4所示的記錄。與此類似,如果點擊了ListBox,也會顯示"Listbox postback"字串。
跟蹤頁麵包含下面的部分(圖3中沒有顯示所有的資訊):
段 |
描述 |
請求細節 |
描述與請求相關的資訊,例如對話ID、編碼和請求的時間。 |
跟蹤資訊 |
包含當前啟動並執行應用程式的詳細資料。跟蹤資訊顯示在這個部分中。 |
控制項樹 |
顯示某個頁面中控制項的資訊和Viewstate 隱藏欄位的大小。 |
Cookie集合 |
顯示頁面和它的值設定的cookie。 |
頭集合 |
顯示HTTP頭資訊,例如內容長度和使用者代理程式。 |
表單集合 |
顯示某個頁面中控制項的名稱和它們的值。 |
伺服器變數 |
顯示伺服器端的環境變數。 |
注意,我們的跟蹤資訊顯示在"跟蹤資訊段"的下面。如果要關閉跟蹤,只需要簡單地把頁面指令中Trace的屬性設定為False。沒有必要刪除應用程式中的跟蹤指令,現在關閉調試僅僅是設定一個布爾值這麼簡單了。
開啟/關閉跟蹤只是簡單地修改頁面指令中的Trace屬性的值。你也可以使用Trace類編程關閉跟蹤。Trace類的成員如下:
屬性 |
描述 |
IsEnabled |
表明是否啟用對當前請求的跟蹤。 |
TraceMode |
設定跟蹤模式:sortByCategory或sortByTime。 |
方法 |
描述 |
Warn |
把跟蹤資訊顯示為紅色。 |
Write |
寫跟蹤資訊。 |
要編程關閉跟蹤,可以在WebForm1的load事件中使用下面的語句:
在我們的例子中,跟蹤資訊沒有很顯目的顯示,因此它被其它的跟蹤資訊掩埋了。Trace類的Warn()方法可以把跟蹤資訊列印為紅色。因此不是這樣編寫代碼:
Trace.Write("Page loaded") |
而是:
Trace.Warn("Page loaded") |
圖5顯示了Warn()方法用紅色顯示的調試資訊。
對跟蹤資訊排序
把多個跟蹤語句放在一個應用程式中有時會顯得雜亂。如果你的跟蹤資訊可以被分為不同的類別,那麼跟蹤就更容易了。Trace類允許我們基於種類對跟蹤資訊進行分類和排序。
下面的例子示範了如何對跟蹤資訊按類別進行分組:
Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load Trace.TraceMode = TraceMode.SortByCategory '此處放置初始化頁面的使用者代碼 Trace.Warn("Page_Load", "Page loaded") If Not IsPostBack Then ' 執行一些操作 Trace.Warn("Page_Load", "Not in a postback") Else Trace.Warn("Page_Load", "In a postback") End If End SubPrivate Sub ListBox1_SelectedIndexChanged(ByVal sender _ As System.Object, ByVal e As _ System.EventArgs) Handles _ ListBox1.SelectedIndexChanged Trace.Warn("ListBox", "Listbox postback") End Sub |
執行這個例子的時候,將顯示下面的調試資訊,它根據類別分組了(圖6所示):
讓我們分析上面的代碼:
Trace.TraceMode = TraceMode.SortByCategory |
TraceMode屬性設定了跟蹤支援的模式:
· SortByCategory:根據類型對跟蹤資訊排序 。
· SortByTime: 根據執行次序對跟蹤資訊進行顯示。
因為我們選擇了根據類別排序模式,因此圖7顯示了資訊按類別排序了。
Trace.Warn("Page_Load", "Page loaded") |
Warn屬性把訊息顯示為紅色,注意這是個重載的方法。在例子中,我們給它傳遞了兩個參數。第一個輸入類別(Category),第二個參數是為取得訊息(Message)的。
除了使用Trace類設定跟蹤模式之外,你還可以使用頁面指令指定跟蹤模式:
<%@ Page Language="vb" Trace="true" TraceMode="SortByCategory" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1" %> |
應用程式跟蹤
最後一部分討論了頁面追蹤,它追蹤頁面內的執行資訊流。ASP.NET同時支援應用程式級的追蹤,應用程式級的追蹤在web.config檔案中設定,在trace段下面:
為了啟用應用程式級追蹤,設定下面的值:
屬性 |
值 |
描述 |
Enabled |
True |
啟用或禁止應用程式級追蹤。 |
requestLimit |
10 |
設定追蹤的請求的最大數量。 |
pageOutput |
False |
在頁面的末尾顯示追蹤資訊。 |
traceMode |
sortByTime |
追蹤資訊排序方式。 |
localOnly |
True |
設定在非本機電腦上查看追蹤瀏覽器的能力。 |
當應用程式被載入後,追蹤資訊沒有顯示在頁面上。為了查看追蹤資訊,我們需要使用追蹤查看器(trace.axd):
圖7顯示了應用程式的最後的六個請求的追蹤資訊。如果要查看每個請求的細節資訊,點擊每一行的"View Details"連結。
注意,如果在web.config檔案中trace被設定為true,並且在頁面指令中它被設定為false,追蹤將被禁止。
總結
ASP.NET使調試Web應用程式容易多了。現在你已經知道了如何使用追蹤,試用一下,看看它把你的效率提高了多少!