天天看點

追蹤ASP.NET代碼裡的bug

web開發中一個棘手的問題是調試。在asp或者簡單javascript的時代,開發人員會利用print語句來追蹤代碼裡的問題。随着微軟引入asp.net,這一方法發生了改變,因為它包含了大量的特性,可以利用tracecontext類更加輕松地調試web頁面。

選擇追蹤的範圍

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

<traceenabled="false"requestlimit="10"pageoutput="false"

tracemode="sortbytime"localonly="true"/>

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

enabled:用來啟動(真)和關閉(僞)應用程式這一級别的追蹤。

requestlimit:用來描述儲存在記憶體裡的追蹤數量。

pageoutput:用來訓示追蹤資訊需要(真)還是不需要(僞)附加在每頁之後。如果選擇了僞,那麼追蹤資訊可以在專門的追蹤頁面——trace.axd裡檢視。

tracemode:用來确定如何顯示追蹤資訊。在預設狀态下,它被設定為按時間順序顯示,但是它也可以按類别(sortbycategory)顯示。

localonly:用來訓示遠端調試可用(僞)或者不可用(真)。

然而,如果應用程式裡隻有一個頁面,那麼你就會在追蹤的時候碰到問題。在這種情況下,你可以在頁面的指令裡加上下面的追蹤屬性,啟動對單個頁面的追蹤:

<%@pagelanguage="c#"trace="true"tracemode="sortbycategory"

codebehind="webform1.aspx.cs"autoeventwireup="false"

inherits="webapplication1.webform1"%>

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

處理輸出

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

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

請求細節(requestdetails):這一部分包括會話的id、請求時間、編碼、請求類型(get、post等等),以及狀态碼。

追蹤資訊(traceinformation):用來顯示請求的細節,這包括和asp.net頁面相關的各種事件。

控件樹(controltree):用來顯示頁面内使用的控件;這包括其大小和儲存在viewstate裡的相關位元組數。

cookie集(cookiescollection):頁面所用的cookie的清單。

标題集(headerscollection):和請求相關的http标題,包括主機(host)、cookie和使用者代理(user-agent)。

伺服器變量:和請求相關的伺服器環境變量的完整清單。

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

headerscollection

namevalue

connectionkeep-alive

accept*/*

accept-encodinggzip,deflate

accept-languageen-us

cookieasp.net_sessionid=vnadwr45jvrfhv55gbdygobs;lastvisited2=3/1/2004

2:11:35pm

hostlocalhost

user-agentmozilla/4.0(compatible;msie6.0;windowsnt5.0;.netclr

1.1.4322)

從這個追蹤結果可以看出,送出請求的用戶端使用英語和internetexplorer6.0,并安裝了.net架構1.1。

加入使用者資訊

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

write:向追蹤日志寫入資訊。

warn:向追蹤日志寫入資訊,但是用紅色顯示寫入的資訊。

每種方法都在承擔着多種任務,大多數基本的句法都會接受簡單的資訊并将其插入到追蹤日志裡。這些方法讓你能夠很輕松地在需要的地方放上trace.write和trace.warn語句,進而向追蹤輸出裡加入使用者資訊。其輸出被包括在追蹤輸出的追蹤資訊部分裡。(我覺得使用warn方法可以更容易地找到我添加的内容,因為它們是以紅色顯示的。)

不需要重新編譯

另一個非常好的特性是,在完成追蹤之後,你不需要删除追蹤元素;隻需要禁用追蹤就行了,這樣追蹤語句會被忽略。當産品中出現問題的時候,其優勢就展現出來了。一旦轉化成為了産品,你可以激活在應用程式這一級别的追蹤,而不對單個頁面進行追蹤(把pageoutput設定成僞),并通過trace.axd頁面來檢視追蹤結果,這樣使用者就不會被打擾了。

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

繼續閱讀