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"%> ******************************************************************************* |
假如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 |
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.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.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,之後能夠讓一些使用者使用該應用程式。這樣在使用者使用過程中,廣大程式愛好者能夠得到跟蹤資訊(用戶端使用者看不到這些資訊),從而有利於判斷錯誤的根源。