跟踪

 

罗布·霍华德
Microsoft Corporation

2001 年 1 月 25 日

每当我就 ASP.NET 进行演示时,在演示新的跟踪功能时,watch观众总是很有趣。 对于我们这些使用 ASP 构建解决方案的人来说,跟踪是一种天方之力!

在本月的列中,我们将介绍 ASP.NET 中的跟踪功能。 让我们首先讨论 ASP 的常见跟踪技术, 即 Response.Write ()

使用 ASP 进行跟踪

如果你和我一样,在编写 ASP 应用程序代码时,在剖析一段代码时,可以使用 Response.Write () 语句。

下面是一些伪代码来说明这一点:

<%
On Error Resume Next 
Response.Write("About to do data access...")
Set objDB = Server.CreateObject("Custom.DataAccess")
objDB.Open("PersonalizationData")
user = objDB.Get("username")
Response.Write("Done calling data access. Value of username is:" + user)
%>

上述代码中的 Response.Write () 调用看起来应该很熟悉,即我们的代码行为出错。 此错误不一定是应用程序或系统错误(例如加载对象失败),而是代码按预期执行但不返回预期值的编码错误。

当然,我们也可以使用调试器,但有时获取跟踪输出来了解代码正在执行什么,或者只是让我们知道特定代码部分的执行方式会更快。

尽管 Repsonse.Write () 语句确实可以轻松快速调试应用程序,但它们会将不必要的代码引入到应用程序中,这可能会导致实际 bug 中断已部署的应用程序。 例如,当我们忘记删除可能表达我们对所处理代码的真实感受的更丰富多彩的 Response.Write () 语句时,这通常不是一件好事。

当然,ASP.NET 支持 Response.Write () 语句的相同功能。 事实上,我仍然发现自己使用 Response.Write () ,即使我们现在有一个跟踪功能。 旧习惯很难打破。

但是,我们都应该尝试打破这些旧习惯,因为新的跟踪功能为我们提供了一些在 ASP: 调试模式下不存在的东西。

使用 ASP.NET 进行跟踪

ASP.NET 的新跟踪功能允许我们模拟 Response.Write () 语句,但不必担心在部署应用程序之前删除语句。 相反,假设编写与上述代码相同的代码,但我们不使用 Response.Write () ,而是使用 Trace.Write ()

Trace 对象现在是一个内部页面对象,类似于请求响应服务器等。可以通过我们的页面代码直接访问它。

让我们简要了解 一下 Trace 类。

Trace 类

跟踪 在 ASP.NET 页中公开为公共属性。 使用 Trace 属性时,我们将使用 System.Web 命名空间中定义的 TraceContext 类的实例。

Trace 类公开两个重载方法和两个属性。 和 这两种方法 Warn()Write(), 都支持两个相同的原型:

VB.NET

Public Sub [Warn | Write](category As String, 
                          message As String, 
                          errorInfo As Exception)
End Sub
Public Sub [Warn | Write](category As String, 
                          message As String)
End Sub

C#

public void [Warn | Write](String category, 
                           String message, 
                           Exception errorInfo)
public void [Warn | Write](String category, 
                           String message)

category 参数用于标识要向其写入消息值的类别名称。 在下面的示例中使用 Write () 方法时,这一点将变得更加明显。 Warn () Write () 在其重载方法中支持的第三个参数是 errorInfo。 这允许我们向跟踪系统传递异常详细信息。

属性

TraceContext 类支持两个公共属性:IsEnabledTraceMode

  • IsEnabled 指示是在页面上启用跟踪还是为应用程序启用跟踪。
  • TraceMode 设置或返回跟踪使用的排序模式。 在下面讨论应用程序级跟踪时,我们将介绍如何配置跟踪模式。

现在我们已经了解了 TraceContext 类支持的 类以及方法和属性的外观,让我们看一下 Trace.Write () 的示例。

<Script runat=server>
Public Function Add(a As Integer, b As Integer) As Integer
  Trace.Write("Inside Add() a: ", a.ToString())
  Trace.Write("Inside Add() b: ", b.ToString())
  return a + b
End Function
</Script>
Call the Add routine: 4 + 5 = <%=Add(4,5)%>

运行此代码时,输出为:

图 1. Trace.Write () 方法的示例

显然,正在调用 Add () 方法。 但是,与 Repsonse.Write () 语句不同, Trace.Write () 语句不会出现在生成的输出中。 若要查看 Trace.Write () 语句的结果,需要为此页或应用程序启用跟踪。

若要启用跟踪,可以使用页指令或配置选项。 让我们看看这两者。

页面跟踪指令

页面指令是 ASP.NET 处理 ASP.NET 资源请求时使用的特殊指令。 Page 指令可用于替代或应用 ASP.NET 页的配置设置。

指令必须是页面上的第一个元素。 它是使用以下语法声明的:

<%@ Directive Attribute="[Value]" %>

使用上述语法,下面介绍如何告知 ASP.NET 我们希望在页面上启用跟踪:

<%@ Page Trace="true" %>

如果将上述指令添加到示例代码中,页面输出看起来就大不相同:

图 2. 已启用跟踪

现在,我们已将跟踪输出添加到页面底部。 跟踪输出 始终 添加到页面末尾。

接下来,让我们看看如何在应用程序级别启用跟踪。 然后,我们将讨论跟踪输出包含的内容。

应用程序跟踪

ASP.NET 使用 XML 配置文件来设置 ASP.NET 应用程序的配置设置。 每个 ASP.NET 安装都会在名为 config.web[系统驱动器]\WinNt\Microsoft.NET\Framework\[version]\ 目录中安装配置文件。

配置文件设置默认 ASP.NET 配置,在 Beta 1 中称为根配置文件。 在此文件中所做的更改会影响所有 ASP.NET Web 应用程序。 我们还可以使用 Web 应用程序中的配置文件来添加或删除从默认 config.web 获取的设置。

我将在未来的一列中更详细地介绍配置。 现在,我们将使用根配置文件为所有 ASP.NET 应用程序应用跟踪设置。

“跟踪”部分

如果打开根 config.web 文件,则会找到一个跟踪部分:

<configuration>
    <trace
        enabled="false"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

跟踪元素有四个属性:

  • enabled =[true/false]"-我们可以将启用的选项设置为 truefalse。 跟踪要么在应用程序级别启用,要么在应用程序级别禁用。 如果将 enabled=false 设置为 ,则仍支持使用前面讨论的 Trace 指令进行页面 跟踪
  • requestlimit = [int]"— 每个应用程序在内存中缓存的跟踪请求总数。 跟踪公开了一个特殊资源 Trace.axd,我们将暂时了解该资源,该资源用于在 pageoutput 设置为 false 时查看跟踪输出。
  • pageoutput = [true/false]"- 通过配置文件启用跟踪时,管理员可以在每个页面上启用或禁用跟踪。 pageoutput 跟踪启用应用程序中每个页面的跟踪详细信息。 但是,当应用程序级跟踪仍处于启用状态时, 可能会关闭 pageoutput 跟踪, (启用 = "true") 。 这会将跟踪请求保留在内存中,以便可通过 trace.axd 获取这些请求,我们将暂时了解这些请求,但不显示在页面的输出中。
  • tracemode = "[SortByTime |SortByCategory]"-跟踪 模式 设置使我们能够控制跟踪详细信息的输出方式。 数据可以按时间或类别进行排序,其中类别区分系统所做的设置和开发人员启用的 Trace.Write () 设置。 例如,在示例中,我们使用了以下内容: Trace.Write ("Inside Add () a:", a.ToString () ) .Trace.Write () 语句的第一个参数是类别。 在本例中,我们将类别 "定义为 Inside Add () a:"。 如果按类别 (tracemode =SortByCategory") 排序,则会在跟踪输出中调用普通页函数之前对此项进行排序。 另一方面,按时间排序按调用所花费的时间量排序。

使用应用程序跟踪

使用上面的相同示例代码,我们可以删除 page 指令,并通过修改 tracing config.web 设置来启用相同的功能。

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="true"
        tracemode="SortByTime"
    />
</configuration>

现在可以调用示例应用程序,删除 Page 指令,并获取相同的输出:

图 3. 已启用跟踪,没有 Page 指令

但是,如果我们想要使用前面提到的功能,即启用跟踪但禁用页面上的输出,该怎么办?

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

如果请求了具有上述配置设置的示例应用程序,则不会获得跟踪输出,尽管跟踪仍已启用。 若要查看跟踪输出,请使用名为 trace.axd 的特殊应用程序。

Trace.axd

Trace.axd 是一个 Http 处理程序。 Http 处理程序是一种编码选项,可用于在最基本的级别处理请求/响应。 Http 处理程序等效于 ISAPI 扩展。 但是,与 ISAPI 不同,可以使用任何 .NET 语言创作它们。 我会在后面的一列中更详细地讨论 Http 处理程序。

Trace.axd 是一个 Http 处理程序,可用于请求应用程序跟踪详细信息。 请求时,我们将获得最后 n 个请求的跟踪日志;n 由配置文件中 requestlimit=“[int]” 设置的值确定。

若要使用 trace.axd,只需在对示例应用程序发出请求的同一应用程序目录中请求 trace.axd 即可:

图 4。 应用程序跟踪请求

从屏幕截图中可以看到,我们会看到一个可以查看的跟踪列表。 这些跟踪视图与跟踪将添加到页面的详细信息相同,不包含页面的输出:

图 5。 请求详细信息

现在,我们已经演练了如何配置和使用跟踪,让我们讨论跟踪输出。

解释跟踪输出

跟踪视图提供的输出(通过 Trace.axd 或页面上提供)提供了六个详细信息部分:

  • 请求详细信息 - 这是基本信息,例如会话 ID、请求时间、Http 请求类型和 Http 响应状态代码。
  • 跟踪信息 - 此部分提供类别和消息的表视图。 如果在代码中使用 Trace.Write () 语句, Trace.Write () 接受的两个参数将分别用作 CategoryMessage 值。 此外,我们还提供了从第一个字节到最后一个字节的时间。
  • 控件树 - 尽管本专栏中尚未讨论,但 ASP.NET 使用服务器控件来以声明方式生成应用程序。 “控件树”部分提供了有关页面中控件的信息。 我们提供了控件的 ID、类型、呈现大小和视图状态大小。 此信息可让我们了解正在使用哪些控件,以及呈现大小和视图状态) 的相关成本 (。
  • Cookie 集合 - 将分析客户端在请求标头中发送的任何 Cookie,并显示其名称、值和大小。
  • 标头集合 - 本节中提供了客户端呈现给服务器的 Http 标头。 它是一个列出 Name/Value 的简单表。
  • 服务器变量 - 服务器变量部分显示服务器变量的名称/值对表。

使用跟踪

如你清楚地看到,跟踪是一项功能强大的新 ASP.NET 功能,旨在简化 Web 应用程序的开发。 但是,我认为在应该和不应该使用跟踪时提及也是值得的。

已部署的应用程序

跟踪会增加请求的开销,不应为已部署的应用程序启用跟踪。 但是,Trace.Write () 语句可以保留在 中,因为它们在未启用跟踪时会被忽略。

对于我们想要在其中捕获数据的已部署应用程序,建议使用 System.Diagnostics 命名空间中的类。 这些类(我将尝试在未来的一列中介绍)允许我们直接写入 Windows 事件日志。

在生成应用程序时,我们绝对应该使用跟踪,但在准备好部署应用程序时禁用跟踪,就像删除那些 Response.Write () 语句一样。

禁用 Trace.axd

如果在生产 Web 服务器上安装了 ASP.NET,建议显式禁用 Trace.axd。 打开根 config.web 文件,找到 <httphandlers> 部分,然后添加以下条目:

<configuration>
        <add verb="*" 
             path="trace.axd"
             type="System.Web.Handlers.TraceHandler" />
        <remove verb="*" path="trace.axd"/>
</configuration>

注意: 我们也可以剪切整个 <add/> 条目,但 <remove> 选项更好,因为它将代码保留在配置文件中,并实现相同的目标,即禁用 trace.axd。 此问题将在 ASP.NET 的 Beta 2 中解决。

总结

ASP.NET 中的跟踪功能是跟踪应用程序正在执行的操作的强大新方法。 过去,我们使用 Response.Write () 语句跟踪应用程序执行时,但现在可以使用 Trace.Write () 语句并将这些语句保留在已部署的代码中。 这可以减少 bug,因为我们在准备好部署应用程序时不会删除代码。

ASP.NET 资源

最后,我想介绍一些可用的新 ASP.NET 资源。 请访问 https://www.asp.net 以了解更多 ASP.NET 资源。

Rob Howard 是.NET Framework团队 ASP.NET 项目经理。 他花任何业余时间,要么和家人在一起,要么在华盛顿东部钓鱼。