Asp.Net Trace 全功略

來源:互聯網
上載者:User
【摘要】ASP.NET的跟蹤功能比ASP有了很大的提高,通過跟蹤資訊有利於判斷WEB應用程式中錯誤的根源。本文通過執行個體詳細解釋了ASP.NET的跟蹤模式。

  【關鍵字】ASP.NET;跟蹤資訊;Trace
  1、引言

  傳統ASP最常用的調試方法是使用Response.Write來設定斷點,在WEB頁面上顯示出某些變數當時的值。但是,這種方法存在不少問題。

  (1)在程式中布滿Response.Write語句,這些語句可能反而影響調試,也會影響頁面的布局。

  (2)調試結束後,還要痛苦地將這些語句刪掉。而在刪除多餘的Response.Write時還要處處小心,防止錯刪必要的Response.Write語句。如果程式有上百行,工作量之大可想而知。

  ASP.NET推出了允許直接在代碼中編寫調試語句的新功能,從而在將應用程式部署到生產伺服器時,無需將它們從應用程式中移除。該功能叫做跟蹤,允許在頁中編寫變數或結構、斷言是否符合某個條件,或只是通過頁或應用程式的執行路徑進行跟蹤。為了收集並顯示這些訊息和其他跟蹤資訊,必須啟用頁或應用程式的跟蹤。當啟用跟蹤時,將發生兩件事情:

  (1)ASP.NET將一系列診斷資訊表緊接著追加在頁輸出之後。還將該資訊發送到跟蹤查看器應用程式(只有當已啟用了應用程式的跟蹤時)。

  (2)ASP.NET在追加效能資料的Trace Information表中顯示自訂診斷訊息。指定的診斷資訊和跟蹤訊息追加在發送到請求瀏覽器的頁輸出中。或者,可以在單獨的跟蹤查看器(trace.axd)中查看該資訊,該查看器顯示給定應用程式中每頁的跟蹤資訊。當ASP.NET處理頁請求時,該資訊可以協助查清錯誤或不希望得到的結果。

  只有在啟用了跟蹤後才處理並顯示跟蹤語句。可以控制是否將跟蹤顯示到頁上、顯示到跟蹤查看器或既顯示到頁上又顯示到跟蹤查看器。

  2、ASP.NET的跟蹤模式的配置

  為了能使用跟蹤功能,就要在頁面或整個應用程式的範圍內啟用它。

  2.1 頁面級的配置

  要在頁面級啟用跟蹤功能,就要在@Page指令中設定Trace屬性。如下所示:

*******************************************************************************
<%@ Page Language="vb" Trace="true" Codebehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1"%>
*******************************************************************************


圖1:跟蹤資訊

  如果Trace的屬性值為true,那麼當頁面被顯示時將在頁面底部顯示跟蹤資訊。而使用TraceMode屬效能調整這些資訊的顯示順序。TraceMode可選的值有:按照時間順序排列(SortByTime)和按類別(SortCategory),其中,預設值為按照時間順序排列。

  2.2 應用程式級的配置

  應用程式級的跟蹤功能有多種選擇,可以通過在config.web檔案中的<system.web>下增加一個XML元素<trace>來設定。

  表1:跟蹤選項

屬性 說明
Enabled 如果應用程式中能使用跟蹤功能為true,否則為false
PageOutput 如果跟蹤資訊顯示在應用程式的頁面上和跟蹤視窗中則為true,否則為false。注意:該屬性將不影響已啟動的跟蹤功能頁
RequestLimit 說明伺服器所能存放的跟蹤請求的最大個數。預設為10個
TraceMode 指名按某種順序顯示跟蹤資訊。按SortByTime(時間順序)或按使用者定義型別的SortByCategory(字母順序)。預設為按時間順序。
LocalOnly 如果為true,跟蹤視窗(trace.axd)只能顯示在Web伺服器的主機上,否則為false。預設為true。

*******************************************************************************
<configuration>
<system.web>
<trace Enabled="true" PageOutPut="false" requestLimit="20" traceMode="SortByTime" localOnly="true"/>

</system.web>
</configuration>
*******************************************************************************

  雖然例子中使用了所有的屬性,但是並非每個屬性都必須設定。而且頁面級的配置將覆蓋應用程式級的配置。比如,在應用程式級禁用了跟蹤功能,但在頁面級又啟用這個功能,那麼跟蹤資訊仍會顯示在頁面上。

  RequstLimit屬性設定了將被記錄的在追蹤記錄檔中的請求的個數,這可以避免日誌量過大。如果localOnly屬性設為true,那麼只在伺服器上看到跟蹤資訊。這使得只有伺服器端可以跟蹤應用程式,而其他使用者卻看不到跟蹤資訊。

  3、ASP.NET的跟蹤模式的輸出

  跟蹤輸出是由TraceContext對象產生的,並分幾部分在ASP.NET頁的底部顯示,1所示。以下是關於這幾個部分和它們的說明。由於跟蹤資訊很多,不可能在一個視窗都顯示出來,因此每一類資訊由獨立的輸出視窗顯示。

  3.1請求的詳細資料

  這部分包含了六項資訊,如下表所示:

  表2:請求資訊

資訊項 說明
Session Id 會話在該伺服器上的唯一識別碼
Time of request 請求產生的時間
Request encoding 請求的編碼方式,如Unicode
Request type Get或Post請求
Status 請求的狀態代碼
Response Encoding 響應的編碼方式,如Unicode


圖2:請求的詳細資料

  3.2 跟蹤資訊

  這類資訊包含了跟蹤過程中應用程式或ASP.NET引擎輸出的跟蹤資訊或警告。預設情況下,ASP.NET引擎將輸出每個實踐開始和結束時的資訊,如PreRender、SaveViewState。輸出的資訊包括:Category(類別)、Message(訊息)、Form First(網頁開始運行算起的時間間隔)以及與Form Last(上一次輸出的跟蹤資訊項的時間間隔)。這些資訊項的顯示順序由@Page的TraceMode屬性或TraceContext對象的TraceMode屬性值決定的。

  跟蹤資訊部分非常重要,我將在下一節中詳細闡述。

  3.3 控制項樹

  控制項樹資訊用樹狀結構顯示了該ASP.NET頁中的所有元素,便於廣大程式員理清控制項之間的從屬關係,從而有助於判斷範圍和所有權。每個元素顯示的資訊有:控制項的Control Id(標識符)、Type(類型)、Render Size Bytes(大小)和ViewState的位元組數等。


圖3:控制項樹

  3.4 Cookies集

  Cookies集資訊列出了所有與該ASP.NET的web應用程式相關的cookies。顯示的資訊包括:Name(名字)、Value(值)和Size(大小)。

  3.5 頭訊息集

  頭訊息集包含了所有傳到ASP.NET的網頁中的HTTP的頭訊息,每一項都將都將顯示Name(名字)和Value(值)。

  3.6 表單訊息集

  只有當ASP.NET網頁中包含了一個表單,且該表單已被提交到伺服器,這類資訊才被顯示出來。它包含兩個很重要的資訊。

  (1) 該網頁的Viewstate,即表單中所有控制項的狀態摘要。

  (2) 所有控制項的Name(名稱)和Value(值)。

  4、編寫跟蹤訊息

  ASP.NET包括Trace對象(與Response、Request或Context對象類似),該對象允許編寫當啟用頁或整個應用程式的跟蹤時出現的調試語句。

  ASP.NET使用TraceContext類來儲存有關請求的資訊、它的控制項階層和跟蹤資訊。跟蹤資訊包括頁請求的某些生命週期階段以及選擇包括的任何自訂語句。通過Page.Trace屬性或Control.Context屬性可以使用TraceContext類。前者在開發ASP.NET頁時可用。後者在要將跟蹤語句包括在自訂伺服器控制項或要從頁以外(如global.asax檔案)包括跟蹤語句時可用。

  TraceContext類的介面很簡單,只有一個建構函式、兩個屬性和兩個方法。當然還有一些從Object類繼承下來的屬性和方法。Page對象中的Trace屬性就是一個TraceContext類的執行個體。TraceContext類提供兩種方法:Write和Warn,這兩種方法允許將語句寫入追蹤記錄。每種方法都被重載並允許指定跟蹤類別、簡訊和可選錯誤資訊。這兩種方法之間的唯一區別就是Warn方法用紅色顯示其文本。

  【注意】當在對Write或Warn方法的調用中指定類別時,可以使用該類別對跟蹤語句進行排序。

  將重載每種方法,並且每種方法都有三個版本。如果當調用Warn或Write時只包括一個字串參數,則ASP.NET將此作為訊息對待。如果包括兩個參數,將第一個作為類別對待,編程時可以使用該參數對啟用跟蹤時顯示在Trace Information表中的訊息進行排序。第三個參數為Exception類型,包含該請求的錯誤資訊。

  4.1 在頁中將自訂跟蹤訊息寫入追蹤記錄

  (1)在頁的代碼聲明塊或程式碼後置類別中,使用Trace屬性調用TraceContext方法之一;

  (2)為跟蹤語句指定可選的category參數。可以使用該類別對所顯示的跟蹤語句進行排序;

  (3)為跟蹤語句指定message參數。這可以是字串或方法;

  (4)指定可選的errorInfo參數,該參數包含有關頁中任何錯誤的資訊;

  下面的TraceContext.Warn方法樣本定義類別為Render,跟蹤訊息為“張志遠在使用Warn跟蹤”。

[C#]
Trace.Warn("Render", "張志遠在使用Warn跟蹤。");
[Visual Basic]
Trace.Warn("Render", "張志遠在使用Warn跟蹤。")

  下面的螢幕闡釋了當啟用頁的跟蹤時呈現到Trace Information表上的自訂跟蹤語句。Warn方法用於產生第一條以紅色文本顯示的訊息,其類別為 Render,訊息為“張志遠在使用Warn跟蹤”。Write方法用於產生具有相同類別的第二條自訂訊息,但訊息為“張志遠在使用Write跟蹤”。


圖4:自訂追蹤記錄

  4.2 在自訂伺服器控制項中將自訂跟蹤訊息寫入追蹤記錄

  (1)在伺服器控制項代碼中,使用Context屬性調用TraceContext方法之一;

  (2)為跟蹤語句指定可選的category參數。可以使用該類別對所顯示的跟蹤語句進行排序;

  (3)為跟蹤語句指定message參數;

  (4)指定可選的errorInfo參數,該參數包含有關頁中任何錯誤的資訊;

  下面的樣本使用Warn方法將自訂語句寫入伺服器控制項的追蹤記錄。類別是ZZY Class,訊息是“張志遠在跟蹤”。

[C#]
Context.Trace.Write("ZZY Class","張志遠在跟蹤。");
[Visual Basic]
Context.Trace.Write("ZZY Class","張志遠在跟蹤。")

  4.3 只有在啟用了跟蹤時跟蹤訊息寫入記錄

  在有些情況下,只有當啟用了跟蹤時,才需要將語句傳遞到Write或Warn方法。TraceContext對象具有布爾屬性(IsEnabled),它允許有條件地調用這些方法。

  建立一個If語句,該語句檢查是否為代碼所屬的頁或應用程式啟用了跟蹤,然後建立一個當Trace.IsEnabled屬性返回true時執行的條件陳述式。

  下面的樣本確認啟用頁的跟蹤,然後使用Write方法從資料庫中將有關資訊寫入Trace Information表。

*******************************************************************************
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Trace.IsEnabled Then
Trace.Write("Prod", "張志遠在跟蹤")
End If
End Sub
*******************************************************************************

  5、小結

  通過以上的介紹,已經能獲得跟蹤資訊了,那麼如何利用它們呢?這要根據具體情況而定。大部分跟蹤資訊(如cookies、頭資訊和伺服器變數)在傳統的ASP中也有。只不過它們不像ASP.NET含在跟蹤查看器中。

  最能體現ASP.NET的強大的跟蹤功能的是其中的跟蹤資訊(這裡是指跟蹤輸出的跟蹤資訊部分的資訊(Message))。有了這部分資訊就能瞭解ASP.NET頁開始啟動並執行時間,以及運行該頁所花的時間。這些資訊對於發現應用程式中的效能瓶頸是很重要的。同時,這些資訊也有助於解決有些代碼不能正常啟動並執行問題,而這淨化藏是因為代碼沒有按照期望的順序執行,或者是重複執行了。這種錯誤在傳統的ASP中往往很難被發現,而有了這部分的跟蹤資訊,這些錯誤就變得顯而易見了。

  恰當地使用應用程式級的跟蹤功能,將大大減少調試Web應用程式所花費的時間和精力。如可以在程式中啟用跟蹤功能,並在web.config中將<trace>元素的PageOutPut屬性設定為false,之後可以讓一些使用者使用該應用程式。這樣在使用者使用過程中,廣大程式愛好者可以得到跟蹤資訊(用戶端使用者看不到這些資訊),從而有利於判斷錯誤的根源。

相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.