2007年6月12日星期二

探索 ASP.NET Futures (Part 3 - Client Diagnostics)

貌似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的类型,在里面将会记录如下一些与客户端异常有关的属性:

  • Data
  • FileName
  • LineNumber
  • Message
  • IpAddress
  • Timestamp
  • UserAgent

你可以直接访问这些属性,以你喜欢的方式进行日志记录,例如记录到你自己的数据库,或者是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>

最后,如果你有兴趣继续关注有关ASP.NET Futures新功能的介绍,可以考虑订阅我的博客:

没有评论:

发表评论