追蹤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頁麵來查看追蹤結果,這樣用戶就不會被打擾了。
最後,追蹤特性會增加應用程序的負擔,這反過來會影響到程序的性能。由於這個原因,你應該隻有在需要的時候才在投入生產的應用程序裏啟動它,而且要(在追蹤完成後)盡快禁用它。
最後更新:2017-04-02 00:06:33