貌似ASP.NET 2.0新增的診斷相關服務沒多少人關注,更沒多少人用,不過對於正在使用此類服務分析站點的人來說,肯定非常期望ASP.Net AJax中的客戶端代碼錯誤也能記錄到診斷日志中,這樣就能獲取更豐富的數據來分析站點不穩定因素的來源。
ASP.NET Futures中已經引入了客戶端診斷服務,在解釋此服務之前不妨先思考一下假如你要自己寫一個客戶端診斷服務會怎麼做。如果我來寫一個客戶端診斷服務,我會設計一個Web Service負責收集錯誤信息,然後記錄到數據庫中,然後寫一個JS負責攔截客戶端異常並且發送到該Web Service。ASP.Net Futures (May CTP)中引入的客戶端診斷服務也差不多就這樣子,只不過設計得更加通用更具擴展性。
使用客戶端診斷時你首先要在頁面上放置一個Diagnostics控件,它負責的就是向客戶段輸出一段JS以便攔截客戶端異常。熟悉ASP.NET AJax控件設計的人應該能猜到Diagnostics控件肯定是一個ScriptControl,不熟悉ASP.Net AJax控件設計的話也可以通過這個例子了解到,如果你有一個客戶端組件要以控件方式在Page上部署那就應該考慮繼承自IScriptControl接口了。
接下來我們要部署接收診斷信息的web service了。新建一個名為DiagnostiCSService.asmx的web service,更改其code-behind聲明如下:
<%@ WebService Language="C#" Class="Microsoft.Web.PrevIEw.Diagnostics.DiagnostiCSService,Microsoft.Web.PrevIEw" %>
這樣做的意思是,此web service不是使用你寫的code-behind代碼,它的code-behind類直接使用上述的DiagnostiCSService類,所需的函數都在裡面了,你不需要再寫任何代碼。那麼我們到底在哪寫代碼記錄客戶段發送來的診斷信息?先別急,接下來我會解釋此事。需要說明的是,ASP.NET Futures現在這個做法的風格和原來的ASP.Net AJax有點格格不入,因為它沒有直接采用HttpHandler的方式直接暴露此web service,而必須要開發者自己部屬一個asmx文件,將來此做法可能改變,屆時將不再需要手動部署asmx文件。
仔細留意DiagnostiCSService,你會發現它有一個OnClIEntException的事件,這才是你真正需要關注的地方。為了確保將所有客戶端異常都記錄下來,你可以在Global.asax的Application_Start中綁定此事件,在HttpModule中綁定也是可以的。在事件的處理函數中,你將通過EventArgs獲取到一個ExceptionServerInfo的類型,在裡面將會記錄如下一些與客戶端異常有關的屬性:
你可以直接訪問這些屬性,以你喜歡的方式進行日志記錄,例如記錄到你自己的數據庫,或者是ASP.Net 2.0的health monitor。
好了,這樣就解釋完如何使用客戶端診斷服務了。嗯……等等……還要一樣重要的事情沒有說,那就是在web.config中啟用此項服務。首先要聲明config section:
<configSections>
<sectionGroup name="microsoft.web.preview" type="Microsoft.Web.Preview.Configuration.PreviewSectionGroup, Microsoft.Web.PrevIEw">
<section name="diagnostics" type="Microsoft.Web.PrevIEw.Configuration.DiagnostiCSSection, Microsoft.Web.PrevIEw"/>
</sectionGroup>
</configSections>
然後聲明啟用此服務:
<microsoft.web.prevIEw>
<diagnostics enabled="true"/>
</microsoft.web.prevIEw>