65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 应用程序新手循序渐进调试指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.54/5 (22投票s)

2010 年 5 月 19 日

CPOL

5分钟阅读

viewsIcon

161609

downloadIcon

2209

解释了调试 ASP.NET 应用程序的循序渐进方法

引言

我对 ASP.NET 还不熟悉,在学习调试时,我发现对于新手来说,关于调试的可用资源很少,但应该涵盖重要主题。我在 CodeProject 上搜索过,但未能找到一个好的入门教程,因此我决定为新手写一篇教程。

目录

  • 调试类型
  • 编写自定义调试信息
  • Page.TraceSystem.Diagnostics.Trace
  • System.Diagnostics 与 ASPX 页面集成(将所有调试信息路由到网页)
  • trace.axd 文件
  • 创建自定义调试侦听器
  • 将调试信息保存到文件

调试类型

在 ASP.NET 中,有两种类型的调试

  • 应用程序级别
  • 页面级别

页面级调试优先于应用程序级调试。

让我们开始创建一个新网站。

web.config 中,在 System.web 元素下方添加以下条目以启用应用程序级调试。

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

其中

  • pageOutput=”true” – 在 ASPX 页面的底部添加调试信息。
  • localOnly=”false” – 任何网页都可以访问调试。
  • requestLimit=”10? – 服务器上应保存多少个请求。
  • mostRecent=”true” - 如果请求达到限制,是否显示最近的调试信息。

web.config 中添加上述标记后,只需运行 Default.aspx 页面,ASP.NET 页面的输出将如下所示

在这里,您可以看到许多显示的信息,例如 SessionId、请求状态、页面上的控件。页面的所有事件及其开始和结束时间等,因此您可以找出 Web 应用程序的性能。

特定页面无调试

创建一个网页,在 aspx 文件的页眉处,编写标记 Trace=”false”

创建一些控件,如链接按钮,并在浏览器中查看页面。您将看到页面显示,没有调试信息,尽管它在 web.config 中已开启,因为页面级调试优先于应用程序级调试。

编写自定义调试信息

现在,在链接按钮的单击事件中,编写自定义调试信息。

protected void lblwriteMessage_Click(object sender, EventArgs e){
Trace.Write(“Custome Message”, “Write Link Button clicked”);
}
protected void lblwarnMessage_Click(object sender, EventArgs e)
{
Trace.Warn(“Custome Message”, “Warn Link Button clicked”);
}  

当您单击 WriteLink 按钮时,将看到以下输出

当您单击 warn 按钮时,消息将以红色显示。因此,建议将重要的调试消息显示为警告。

Page.Trace 与 System.Diagnostics.Trace

创建一个新的类文件,并编写一个 static 函数来写入 Trace 消息。您会注意到 Trace 对象不像 ASPX 页面那样默认可用,而是需要导入“System.Diagnostics”包。

因此,System.Diagnostic.Trace Page.Trace 之间存在很大差异。

Diagnostics 的 Trace 将调试信息显示在 Visual Studio 的输出窗口中,而 Page 的 Trace 将调试信息显示在 ASPX 页面中。

将 System.Diagnostics 与 ASPX 页面集成(将所有调试信息路由到网页)

我们需要在 web.config 文件中添加侦听器,将所有调试信息路由到单个网页。

要将 System.Diagnostics Trace 与 ASPX 页面集成,请在 web.config 中写入以下代码行。

  <system.diagnostics> 
  <trace> 
    <listeners>
       <add name="WebPageTraceListener"
            type="System.Web.WebPageTraceListener, System.Web, 
	   Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    </listeners>
  </trace>
</system.diagnostics> 

输出将如下所示

trace.axd 文件

此文件包含有关应用程序调试的所有信息。

要查看调试信息,只需写入文件名,您将获得一个页面,该页面将如下所示。

路径结构:http://<servername>/webapp/trace.axd

创建自定义调试侦听器

数据库调试侦听器

.NET 为我们提供了以 TraceListener 类形式编写自己的调试侦听器的灵活性。每个调试侦听器都继承自此类,因此,为了实现您自己的 Trace 侦听器,您必须从该类继承您的 Trace 侦听器类。

所有 Trace 侦听器都具有以下函数。这些函数的功能相同,只是调试输出的目标介质由 Trace 侦听器确定。

方法名称 结果
失败 输出带有调用堆栈的指定文本。
Write 输出指定的文本。
WriteLine 输出指定的文本和一个回车符。
Flush 将输出缓冲区刷新到目标介质。
Close 关闭输出流,以免接收调试/跟踪输出。

TraceListener 类有许多虚方法和抽象方法;最少,此类的每个继承者都必须实现 Write WriteLine 方法;其他重要方法是 FailClose Flush。继承者不需要实现这些方法,但实现这些方法是一个好主意。这些方法的描述在文章开头给出。

Write WriteLine 方法是重载的;以下是 Write 方法所有重载版本的列表

  • public override void Write(string message)
  • public override void Write(object o)
  • public override void Write(object o, string category)
  • public override void Write(string message, string category)

对于本文,我创建了一个调试侦听器 DatabaseTraceListener,它实际上将调试和跟踪消息存储到数据库中。

Web.config 中添加以下代码,其中存储了连接字符串信息。

<appSettings> <add key="ConnectionString" 
value="Data Source=.\SQLExpress;Integrated Security=True;
User Instance=True;AttachDBFilename=|DataDirectory|TraceDB.mdf" />
<add key="MaximumRequests" value="2" /> </appSettings>  

表的结构如下

  • TraceDateTime 列存储调试消息的日期和时间
  • TraceCategory 列存储调试消息的实际类别
  • TraceDescription 列存储调试消息
  • StackTrace 列包含堆栈跟踪
  • DetailedErrorDescription 列包含在 Fail 方法的第二个参数中传递的详细错误消息

创建以下存储过程

CREATE procedure usp_AddTrace 
@r_dtTraceDateTime	datetime,
@r_vcTraceCategory	varchar(50),
@r_vcTraceDescription	varchar(1024),
@r_vcStackTrace		varchar(2048),
@r_vcDetailedErrorDescription	varchar(2048)
as 
begin 
insert
Traces 	(TraceDateTime, TraceCategory, TraceDescription, 
	StackTrace, DetailedErrorDescription) 
values 
(@r_dtTraceDateTime, @r_vcTraceCategory, @r_vcTraceDescription, 
	@r_vcStackTrace, @r_vcDetailedErrorDescription) 
return @@error
end 

现在创建一个名为“DatabaseTraceListener”的类,它继承自 abstract 类“TraceListener”。您可以在本文的源代码中查看代码片段。

如果您想实现自己的调试侦听器,只需从 TraceListener 类派生您的 listener 类,至少实现 Write WriteLine 方法即可。

在我们的示例中,Flush Close 方法只是将所有缓存的消息保存到数据库中。

将调试信息保存到文件

我们还可以将调试信息保存在日志文件中。

要将调试信息保存到文件,只需在 web.config 中添加以下条目。

<add name="myListener" type="System.Diagnostics.TextWriterTraceListener" 
initializeData="TextWriterOutput.log" />  

致读者

我尝试涵盖 ASP.NET 应用程序调试相关的大部分主题,但如果我遗漏了任何重要概念/主题,请指出。我希望这能帮助一些想学习 ASP.NET 调试的新开发人员。

历史

  • 2010 年 5 月 19 日:初始帖子
© . All rights reserved.