追蹤ASP.NET代碼裡的bug

來源:互聯網
上載者:User
asp.net Web開發中一個棘手的問題是調試。在ASP或者簡單JavaScript的時代,開發人員會利用print語句來追蹤代碼裡的問題。隨著微軟引入ASP.NET,這一方法發生了改變,因為它包含了大量的特性,可以利用TraceContext類更加輕鬆地調試Web頁面。

選擇追蹤的範圍

在ASP.NET應用程式裡,你可以啟動對單個頁面或者整個Web應用程式進行追蹤的能力。Web.config這個檔案用來啟動在應用程式這一層級進行的追蹤。下面就用到了web.config檔案裡的追蹤元素:

<trace enabled="false" requestLimit="10" pageOutput="false"
traceMode="SortByTime" localOnly="true" />

現在讓我們更加仔細地看看其各個屬性:

enabled:用來啟動(真)和關閉(偽)應用程式這一層級的追蹤。
requestLimit:用來描述儲存在記憶體裡的追蹤數量。
pageOutput:用來指示追蹤資訊需要(真)還是不需要(偽)附加在每頁之後。如果選擇了偽,那麼追蹤資訊可以在專門的追蹤頁面——trace.axd裡查看。
traceMode:用來確定如何顯示追蹤資訊。在預設狀態下,它被設定為按時間順序顯示,但是它也可以按類別(SortByCategory)顯示。
localOnly:用來指示遠端偵錯可用(偽)或者不可用(真)。
然而,如果應用程式裡只有一個頁面,那麼你就會在追蹤的時候碰到問題。在這種情況下,你可以在頁面的命令裡加上下面的追蹤屬性,啟動對單個頁面的追蹤:

<%@ Page language="c#" trace="true" tracemode="SortByCategory"
Codebehind="WebForm1.aspx.cs" AutoEventWireup="false"
Inherits="WebApplication1.WebForm1" %>

要注意trace和tracemode屬性會和它們在web.config檔案裡對應的屬性發生衝突。如果你還不清楚哪個設定是優先的,那麼我告訴你,版面設定會取代web.config的設定,所以你在追蹤整個應用程式的時候要啟動它,而在追蹤所選頁面的時候禁用它。是選擇頁面還是應用程式這一層級(或者是把兩者結合起來)進行追蹤要根據情況來決定。

處理輸出
一旦決定了需要追蹤的層級,你就要開始接收追蹤的結果了。如果是正在追蹤整個應用程式,那麼你可以在trace.axd頁面裡查看所有的追蹤結果(具體有多少要取決於你用requestLimit屬性維持的數量)。同樣的,對單個頁面的追蹤進行完之後,你可以查看單個頁面的追蹤。

追蹤的輸出結果分為五個部分:

請求細節(Request Details):這一部分包括會話的ID、請求時間、編碼、請求類型(get、post等等),以及狀態代碼。
追蹤資訊(Trace Information):用來顯示請求的細節,這包括和ASP.NET頁面相關的各種事件。
控制項樹(Control Tree):用來顯示頁面內使用的控制項;這包括其大小和儲存在ViewState裡的相關位元組數。
Cookie集(Cookies Collection):頁面所用的cookie的列表。
標題集(Headers Collection):和請求相關的HTTP標題,包括主機(Host)、Cookie和使用者代理程式(User-Agent)。
伺服器變數:和請求相關的伺服器環境變數的完整列表。

在下面的例子裡,我列出了追蹤結果的一部分資訊。(它包括追蹤結果的標題集部分。)


Headers Collection
Name Value
Connection Keep-Alive
Accept */*
Accept-Encoding gzip, deflate
Accept-Language en-us
Cookie ASP.NET_SessionId=vnadwr45jvrfhv55gbdygobs; LastVisited2=3/1/2004
2:11:35 PM
Host localhost
User-Agent Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR
1.1.4322)

從這個追蹤結果可以看出,發出請求的用戶端使用英語和Internet Explorer 6.0,並安裝了.NET架構1.1。

加入使用者資訊
預設的追蹤能力在很多情況下都很有用處,但是其他的情況可能要求獲得頁面的更多資訊。你可以利用TraceContext類的Write(寫入)和Warn(警告)方法向追蹤日誌裡添加使用者資訊:

Write:向追蹤日誌寫入資訊。
Warn:向追蹤日誌寫入資訊,但是用紅色顯示寫入的資訊。
每種方法都在承擔著多種任務,大多數基本的句法都會接受簡單的資訊並將其插入到追蹤日誌裡。這些方法讓你能夠很輕鬆地在需要的地方放上Trace.Write和Trace.Warn語句,從而向追蹤輸出裡加入使用者資訊。其輸出被包括在追蹤輸出的追蹤資訊部分裡。(我覺得使用Warn方法可以更容易地找到我添加的內容,因為它們是以紅色顯示的。)

不需要重新編譯
另一個非常好的特性是,在完成追蹤之後,你不需要刪除追蹤元素;只需要禁用追蹤就行了,這樣追蹤語句會被忽略。當產品中出現問題的時候,其優勢就體現出來了。一旦轉化成為了產品,你可以啟用在應用程式這一層級的追蹤,而不對單個頁面進行追蹤(把pageOutput設定成偽),並通過trace.axd頁面來查看追蹤結果,這樣使用者就不會被打擾了。

最後,追蹤特性會增加應用程式的負擔,這反過來會影響到程式的效能。由於這個原因,你應該只有在需要的時候才在投入生產的應用程式裡啟動它,而且要(在追蹤完成後)儘快禁用它。

--------------------------------------------------------------------------------
本文作者:Tony Patton的職業生涯開始於應用程式開發員,並已經獲得了Java、VB、Lotus和XML的認證,以增加其專業知識。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。