当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 追踪ASP.NET代码里的bug

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

追踪ASP.NET代码里的bug


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 82 ::
收藏到网摘: n/a

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页面来查看追踪结果,这样用户就不会被打扰了。

最后,追踪特性会增加应用程序的负担,这反过来会影响到程序的性能。由于这个原因,你应该只有在需要的时候才在投入生产的应用程序里启动它,而且要(在追踪完成后)尽快禁用它。


--------------------------------------------------------------------------------
本文作者:TonyPatton的职业生涯开始于应用程序开发员,并已经获得了Java、VB、Lotus和XML的认证,以增加其专业知识。