追踪ASP.NET代码里的bug

asp.net

Web开发中一个棘手的问题是调试。在ASP或者简单JavaScript的时代,开发人员会利用print语句来追踪代码里的问题。随着微软引入ASP.NET,这一方法发生了改变,因为它包含了大量的特性,可以利用TraceContext类更加轻松地调试Web页面。
选择追踪的范围

在ASP.NET应用程序里,你可以启动对单个页面或者整个Web应用程序进行追踪的能力。Web.config这个文件用来启动在应用程序这一级别进行的追踪。下面就用到了web.config文件里的追踪元素:

<trace enabled="false" requestLimit="10" pageOutput="false"
traceMode="SortByTime" localOnly="true" />

现在让我们更加仔细地看看其各个属性:

enabled:用来启动(真)和关闭(伪)应用程序这一级别的追踪。
requestLimit:用来描述保存在内存里的追踪数量。
pageOutput:用来指示追踪信息需要(真)还是不需要(伪)附加在每页之后。如果选择了伪,那么追踪信息可以在专门的追踪页面——trace.axd里查看。
traceMode:用来确定如何显示追踪信息。在缺省状态下,它被设置为按时间顺序显示,但是它也可以按类别(SortByCategory)显示。
localOnly:用来指示远程调试可用(伪)或者不可用(真)。
然而,如果应用程序里只有一个页面,那么你就会在追踪的时候碰到问题。在这种情况下,你可以在页面的命令里加上下面的追踪属性,启动对单个页面的追踪:

<%@ Page language="c#" trace="true" tracemode="SortByCategory"
Codebehind="WebForm1.aspx.cs" AutoEventWireup="false"
Inherits="WebApplication1.WebForm1" %>

要注意trace和tracemode属性会和它们在web.config文件里对应的属性发生冲突。如果你还不清楚哪个设置是优先的,那么我告诉你,页面设置会取代web.config的设置,所以你在追踪整个应用程序的时候要启动它,而在追踪所选页面的时候禁用它。是选择页面还是应用程序这一级别(或者是把两者结合起来)进行追踪要根据情况来决定。

处理输出
一旦决定了需要追踪的级别,你就要开始接收追踪的结果了。如果是正在追踪整个应用程序,那么你可以在trace.axd页面里查看所有的追踪结果(具体有多少要取决于你用requestLimit属性维持的数量)。同样的,对单个页面的追踪进行完之后,你可以查看单个页面的追踪。

追踪的输出结果分为五个部分:

请求细节(Request Details):这一部分包括会话的ID、请求时间、编码、请求类型(get、post等等),以及状态码。
追踪信息(Trace Information):用来显示请求的细节,这包括和ASP.NET页面相关的各种事件。
控件树(Control Tree):用来显示页面内使用的控件;这包括其大小和保存在ViewState里的相关字节数。
Cookie集(Cookies Collection):页面所用的cookie的列表。
标题集(Headers Collection):和请求相关的HTTP标题,包括主机(Host)、Cookie和用户代理(User-Agent)。
服务器变量:和请求相关的服务器环境变量的完整列表。

在下面的例子里,我列出了追踪结果的一部分信息。(它包括追踪结果的标题集部分。)

Headers Collection
Name Value
Connection Keep-Alive
Accept */*
Accept-Encoding gzip, deflate
Accept-Language en-us
Cookie ASP.NET_SessionId=vnadwr45jvrfhv55gbdygobs; LastVisited2=3/1/2004
2:11:35 PM
Host localhost
User-Agent Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR
1.1.4322)

从这个追踪结果可以看出,发出请求的客户端使用英语和Internet Explorer 6.0,并安装了.NET框架1.1。

加入用户信息
缺省的追踪能力在很多情况下都很有用处,但是其他的情况可能要求获得页面的更多信息。你可以利用TraceContext类的Write(写入)和Warn(警告)方法向追踪日志里添加用户信息:

Write:向追踪日志写入信息。
Warn:向追踪日志写入信息,但是用红色显示写入的信息。
每种方法都在承担着多种任务,大多数基本的句法都会接受简单的信息并将其插入到追踪日志里。这些方法让你能够很轻松地在需要的地方放上Trace.Write和Trace.Warn语句,从而向追踪输出里加入用户信息。其输出被包括在追踪输出的追踪信息部分里。(我觉得使用Warn方法可以更容易地找到我添加的内容,因为它们是以红色显示的。)

不需要重新编译
另一个非常好的特性是,在完成追踪之后,你不需要删除追踪元素;只需要禁用追踪就行了,这样追踪语句会被忽略。当产品中出现问题的时候,其优势就体现出来了。一旦转化成为了产品,你可以激活在应用程序这一级别的追踪,而不对单个页面进行追踪(把pageOutput设置成伪),并通过trace.axd页面来查看追踪结果,这样用户就不会被打扰了。

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

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

时间: 2025-01-20 10:46:37

追踪ASP.NET代码里的bug的相关文章

在ASP.NET代码里访问跟踪信息

asp.net|访问 ASP.NET 2.0允许通过代码在TraceFinished事件里来访问每个请求的跟踪信息.TraceFinished事件是由TraceContext对象引发,用于在收集完所有请求信息后公开跟踪消息.可以利用此事件对跟踪信息进行不同的输出.以下代码就是用程序输出跟踪信息. C#: <%@ Page Language="C#" %><SCRIPT runat="server">protected void Page_Lo

ASP.NET技巧:ASP.NET代码里访问跟踪信息

asp.net|访问|技巧 ASP.NET 2.0允许通过代码在TraceFinished事件里来访问每个请求的跟踪信息.TraceFinished事件是由TraceContext对象引发,用于在收集完所有请求信息后公开跟踪消息.可以利用此事件对跟踪信息进行不同的输出.以下代码就是用程序输出跟踪信息. C#: <%@ Page Language="C#" %><SCRIPT runat="server">protected void Page

在ASP.NET代码中增加了一个验证环节/提示窗口,页面竟然出现了惊人的BUG面目全非请问有谁出现过这种事情求解答方法?代码都列出来了

问题描述 在ASP.NET代码中增加了一个提示窗口,页面竟然出现了惊人的BUG面目全非protectedvoidButton1_Click(objectsender,EventArgse){if(TextBox1.Text.ToString().Trim()==""){Page.ClientScript.RegisterStartupScript(GetType(),"sf","<scriptlanguage='javascript'>aler

hibernate-下面代码里为什么要有hidden,hidden的作用,hidden返回的值是什么?

问题描述 下面代码里为什么要有hidden,hidden的作用,hidden返回的值是什么? function login(){ var hidden=document.getElementById("hidden").value; if(document.getElementById("username"+hidden).value ==""){ alert("用户名不能为空"); return false; }else i

利用FindBugs减少代码中的bug数学习

FindBugs 作用 开发人员在开发了一部分代码后,可以使用FindBugs进行代码缺陷的检查.提高代码的质量,同时也可以减少测试人员给你报的bug数. 静态分析工具承诺无需开发人员费劲就能找出代码中已有的缺陷.当然,如果有多年的编写经验,就会知道这些承诺并不是一定能兑现. 代码缺陷分类 根据缺陷的性质,大致可以分为下列几类 ·Bad practice  不好的做法·Correctness   可能有不正确·Dodgy code     糟糕的代码·Experimental  实验·Inter

asp.net代码啊关于时间查询历史记录的代码如何实现.......急求

问题描述 asp.net代码啊关于时间查询历史记录的代码如何实现.......急求 本人想根据时间查询以往购物车的记录该怎么写. 另外关于商品图片的问题,是应该放在后台数据库还是VS里

如何减少代码中的BUG

问题描述 刚开始工作,代码中BUG总是一个一个.为了减少BUG,我增加了自己测试的时间.当然BUG少了一些,请问还有其它的思路么? 解决方案 解决方案二:买瓶杀虫剂放手边随时准备着解决方案三:与其事后修补,为何事先不弄得好一些呢很多的BUG都是由于很不好的编码习惯造成的,比如说:从来不对public方法传入的参数进行有效性或者非空检查之类的.解决方案四:自己积累一些框架,用的时候套用曾写过的代码...解决方案五:没事的,刚刚开始工作嘛,以后就会好的.BUG允许出现一次,但是下次我想不会再出现同样

求助: 为何我这个代码里的事件会自动被window对象触发

问题描述 求助: 为何我这个代码里的事件会自动被window对象触发 用onchange绑定了一个事件,然而每次刷新页面会自动触发这个事件,alert了事件源获得了window对象 求解~~~~ 代码如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <

PHP和ASP.NET代码哪个运行速度更快?

刚刚在9月编程语言排行榜上取得历史性突破的PHP在Web开发领域最到的对手可能就是基于微软.NET技术的ASP.NET.近日,微软的Joe Stagner在博客上发表了一系列文章比较了PHP和ASP.NET性能方面的文章,引起了来自双方程序员的大量回应.Joe表示,他会将这样的测试持续下去,并寻求更为合适的方式,以获得对实际项目来说尽可能有参考价值的结论. Joe在博客中称,一般来说,作性能测试的目的是要尝试证明一方比令一方要快.我受雇于微软,同时编写PHP和ASP.NET代码.我在.NET出现