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






4.54/5 (22投票s)
解释了调试 ASP.NET 应用程序的循序渐进方法
引言
我对 ASP.NET 还不熟悉,在学习调试时,我发现对于新手来说,关于调试的可用资源很少,但应该涵盖重要主题。我在 CodeProject 上搜索过,但未能找到一个好的入门教程,因此我决定为新手写一篇教程。
目录
- 调试类型
- 编写自定义调试信息
Page.Trace
与System.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
方法;其他重要方法是 Fail
、Close
和 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 日:初始帖子