演练:将 ASP.NET 跟踪与 System.Diagnostics 跟踪集成

更新:2007 年 11 月

本演练描述如何将 ASP.NET 跟踪技术与 System.Diagnostics 跟踪技术集成以及如何将所有跟踪消息写入单个跟踪输出中。

使用跟踪可以跟踪应用程序的执行流、显示 Web 窗体生命周期中关键点的数据并可以弄清楚 Web 窗体是如何与应用程序的其他各个组件进行交互的。使用跟踪还可以检查提交给应用程序的 HTTP 请求参数、在视图状态中为特定 Web 窗体所存储的内存量以及其他有用的分析信息。

ASP.NET 跟踪机制写入显示在 ASP.NET 网页和 ASP.NET 跟踪查看器 (Trace.axd) 上的消息,而 Trace 类用于将跟踪消息写入标准的 .NET Framework 跟踪输出(通常是一个控制台窗口)中。若要更容易地跟踪 Web 窗体如何与业务对象及其他组件进行交互,可以将 ASP.NET 跟踪输出与 System.Diagnostics 跟踪进行集成,以将所有跟踪消息传送到其中的一个输出中。

同时使用 ASP.NET 跟踪和 Trace 类的常见方案包括使用中间层业务对象与使用企业服务(如事务和队列)的数据、业务规则和页面进行交互的网页。在这些方案中,业务组件和企业组件对于成功执行页发挥重要作用,而且需要使用单个跟踪输出跨应用程序的多个层来监视页的执行流。

在本演练中,您将使用跟踪。您将修改一个网页和一个业务对象以写入跟踪消息,然后将所有消息传送到一个跟踪输出中。

本演练涉及以下任务:

  • 创建一个可向网页返回数据的自定义业务组件。该组件从 XML 文件读取数据。

  • 创建一个将自定义业务对象作为数据源引用的网页。

  • 为正引用该业务对象的网页启用跟踪。

  • 将跟踪消息写入正引用该业务对象的网页。

  • 在一个自定义业务对象中写入 Trace 消息。

  • 配置 ASP.NET 应用程序以将所有跟踪消息写入单个输出中。

  • 读取跟踪输出。

先决条件

若要完成本演练,您需要:

  • Microsoft .NET Framework 和一个现有 ASP.NET 网站。
b0ectfxd.alert_note(zh-cn,VS.90).gif说明:

本演练假定您不使用 Microsoft Visual Web Developer Web 开发工具或 Microsoft Visual Studio 之类的设计器。

创建一个网页和业务对象

在本演练中,您将创建 Default.aspx 网页、一个 AuthorClass 业务对象及本演练后面涉及跟踪的步骤所需的 Authors.xml XML 数据文件。

可以将源代码复制并粘贴到 ASP.NET 目录中的文件内。这样可创建 Default.aspx 网页、, AuthorClass 业务对象和 Authors.xml 文件。

创建 Default.aspx 页

  1. 打开文本编辑器(如记事本),并创建一个新文件。

  2. 在该文件中输入以下代码。

    <%@ Page Language="VB" %>
    <html>
    <form runat="server">
        <asp:objectdatasource
          id="AuthorsObjectDataSource"
          runat="server"
          typename="PubsClasses.AuthorClass"
          selectmethod="GetAuthors"/>
    
        <asp:gridview
          id="GridView1"
          runat="server"
          datasourceid="AuthorsObjectDataSource" />
    </form>
    </html>
    
    <%@ Page Language="C#" %>
    <html>
    <form runat="server">
        <asp:objectdatasource
          id="AuthorsObjectDataSource"
          runat="server"
          typename="PubsClasses.AuthorClass"
          selectmethod="GetAuthors"/>
    
        <asp:gridview
          id="GridView1"
          runat="server"
          datasourceid="AuthorsObjectDataSource" />
    </form>
    </html>
    
  3. 将该文件作为 Default.aspx 保存在 ASP.NET 应用程序根目录中。

Default.aspx 页使用一个名为 AuthorClass 的业务对象与 XML 数据交互。

创建 AuthorClass 业务对象

  1. 在应用程序根目录下,创建一个名为 App_Code 的目录。

  2. 在文本编辑器(如记事本)中,打开一个新文件。

  3. 在该文件中输入以下代码。

    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Web
    Imports System.Data
    Namespace PubsClasses
        Public Class AuthorClass
            Private dsAuthors As DataSet = _
                New System.Data.DataSet("ds1")
            Private filePath As String = _
               HttpContext.Current.Server.MapPath("~/App_Data/authors.xml")
            Public Sub New()
                dsAuthors.ReadXml(filePath, Data.XmlReadMode.ReadSchema)
            End Sub
    
            Public Function GetAuthors() As DataSet
                Return dsAuthors
            End Function
        End Class
    End Namespace
    
    using System;
    using System.Web;
    using System.Data;
    namespace PubsClasses
    {
        public class AuthorClass
        {
            private DataSet dsAuthors = new DataSet("ds1");
            private String filePath =
                HttpContext.Current.Server.MapPath("~/App_Data/authors.xml");
    
            public AuthorClass()
            {
                dsAuthors.ReadXml (filePath, XmlReadMode.ReadSchema);
            }
    
            public DataSet GetAuthors ()
            {
                return dsAuthors;
            }
        }
    }
    
  4. 在 App_Code 目录中,将该文件保存为 AuthorClass.cs(对于 C#)或 AuthorClass.vb(对于 Microsoft Visual Basic)。

AuthorClass 使用的数据文件为 Authors.xml。

启用跟踪并显示 ASP.NET 跟踪消息

  1. 在应用程序根目录下,创建一个名为 App_Data 的目录。

  2. 在文本编辑器(如记事本)中,打开一个新文件。

  3. 在该文件中输入以下 XML 数据。

    XML 文件包含标识数据的数据库结构的架构信息。这包括对键的主键约束。

    b0ectfxd.alert_note(zh-cn,VS.90).gif说明:

    业务组件可以使用适合应用程序的任何方式来使用数据。为方便起见,本演练使用了一个 XML 文件。

    <?xml version="1.0" standalone="yes"?>
    <dsPubs xmlns="http://www.tempuri.org/dsPubs.xsd">
    <xs:schema id="dsPubs" targetNamespace="http://www.tempuri.org/dsPubs.xsd" xmlns:mstns="http://www.tempuri.org/dsPubs.xsd" xmlns="http://www.tempuri.org/dsPubs.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
        <xs:element name="dsPubs" msdata:IsDataSet="true">
          <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="authors">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="au_id" type="xs:string" />
                    <xs:element name="au_lname" type="xs:string" />
                    <xs:element name="au_fname" type="xs:string" />
                    <xs:element name="au_phone" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:complexType>
          <xs:unique name="Constraint1" msdata:PrimaryKey="true">
            <xs:selector xpath=".//mstns:authors" />
            <xs:field xpath="mstns:au_id" />
          </xs:unique>
        </xs:element>
      </xs:schema>
      <authors>
        <au_id>172-32-1176</au_id>
        <au_lname>White</au_lname>
        <au_fname>Gerry</au_fname>
        <au_phone>408 496-7223</au_phone>
      </authors>
      <authors>
        <au_id>213-46-8915</au_id>
        <au_lname>Green</au_lname>
        <au_fname>Marjorie</au_fname>
        <au_phone>415 986-7020</au_phone>
      </authors>
    </dsPubs>
    
  4. 在 App_Data 目录中,将该文件保存为 Authors.xml,然后关闭该文件。

将跟踪消息添加到网页和业务对象

创建了 Default.aspx 页、Authors.xml 数据文件和 AuthorClass 业务对象后,就可以开始使用跟踪。在将任意跟踪消息添加到代码之前,先为 Default.aspx 页启用跟踪。

启用跟踪并显示 ASP.NET 跟踪消息

  1. 在文本编辑器(如记事本)中,打开 Default.aspx 页。

  2. 将一个 Trace 属性添加到 @ Page 指令中,然后将 Trace 设置为 true。

    该声明为该网页启用 ASP.NET 跟踪。

    有关更多信息,请参见 如何:启用 ASP.NET 页跟踪

现在已启用页跟踪,而且当您在 Web 浏览器中查看该页时,就会看到 GridView 控件后跟有跟踪输出。所显示的第二个跟踪表**“跟踪信息”**显示有关网页的执行路径的详细信息。

有关如何读取跟踪输出的更多信息,请参见 读取 ASP.NET 跟踪信息 主题。

写入跟踪消息

若要更好地了解某些 ASP.NET 基本操作(如 Default.aspx 页中的 GridView 控件所执行的数据绑定)出现的位置,请将跟踪消息添加到该网页和 AuthorClass 业务对象中。

从 Web 窗体中写入跟踪消息

  • 在 Default.aspx 网页中,在 @ Page 指令之后但在 <html> 标记之前输入以下代码。

    <script runat="server">
    
    Private Sub Page_Load(sender As Object, e As EventArgs)    
        Trace.WriteLine("ASP.NET TRACE","page_load called.")
        Trace.WriteLine("ASP.NET TRACE","page_load finished.")
    End Sub ' Page_Load
    
    </script>
    
    <script runat="server">
    private void page_load(object sender, EventArgs e) {
    
        Trace.WriteLine("ASP.NET TRACE","page_load called.");
        Trace.WriteLine("ASP.NET TRACE","page_load finished.");
    }
    </script>
    
    b0ectfxd.alert_note(zh-cn,VS.90).gif说明:

    可能必须在 @ Page 指令中提供一个语言属性,具体取决于您使用的语言。

这些跟踪消息将写入 ASP.NET 跟踪输出中,当您再次查看 Default.aspx 页时,即可在**“Begin Load”“End Load”之间的“跟踪信息”节中看到这些跟踪消息。“Begin Load”“End Load”**与 Page_Load 方法相关联。

现在,要将跟踪消息添加到业务对象 AuthorClass 中。

将跟踪消息写入 AuthorClass 业务对象中

  1. 在 AuthorClass 构造函数中输入以下代码。

    System.Diagnostics.Trace.Write("AuthorClass is created.", "AUTHORCLASS TRACE")
    
    System.Diagnostics.Trace.Write("AuthorClass is created.", "AUTHORCLASS TRACE");
    
  2. 在 AuthorClass.GetAuthors 方法中输入以下代码。

    System.Diagnostics.Trace.Write("GetAuthors called.","AUTHORCLASS TRACE")
    
    System.Diagnostics.Trace.Write("GetAuthors called.","AUTHORCLASS TRACE");
    
    b0ectfxd.alert_note(zh-cn,VS.90).gif说明:

    如果使用 ASP.NET TraceContext.Write 方法,则在该方法的参数列表中,跟踪类别出现在跟踪消息之前。但如果使用 .NET Framework Write 跟踪方法,则跟踪消息出现在跟踪类别之前。

如果编译带有 TRACE 编译器选项的业务对象,则这些跟踪消息将写入系统跟踪输出中。这些跟踪消息不像 ASP.NET 跟踪消息一样写入 Default.aspx 页中。若要测试这一点,请查看 Default.aspx 页,并验证前面所看到的**“跟踪信息”表中是否只显示同样的“ASP.NET 跟踪”**消息。

在下一节中,您将学习如何配置 ASP.NET Web 应用程序以在启用 TRACE 选项的情况下自动进行编译并将所有跟踪消息都传送到网页中。

将所有跟踪输出传送到 Web 窗体中

通过将 AuthorClass 业务对象中包含的 Trace 消息传送到 ASP.NET 跟踪输出,可以显示在处理请求期间何时创建和操作 AuthorClass,并使您可以更全面地查看应用程序的执行情况。若要将 Trace 消息传送到 ASP.NET 网页,必须添加一个 WebPageTraceListener 对象。可以通过配置(推荐)或以编程方式添加跟踪侦听器。有关通过配置来添加跟踪侦听器的更多信息,请参见 <trace> -> <listeners> 元素

在下面的过程中,将需要一个 Web.config 文件。如果已有 Web.config 文件,则跳过下面的过程并转到再后面的过程,在该过程中将添加一个 WebPageTraceListener 对象。

创建 Web.config 文件

  1. 打开文本编辑器(如记事本),并创建一个新文件。

  2. 在该文件中输入以下文本。

    <!-- Web.Config Configuration File -->
    <configuration>
        <system.web>
            <customErrors mode="Off"/>
        </system.web>
    </configuration>
    
  3. 将该文件作为 Web.config 保存在 Default.aspx 所在的同一目录中。

然后,将 WebPageTraceListener 对象添加到应用程序中,以将 Trace 消息传送到 ASP.NET 跟踪输出中。

通过配置向应用程序添加 WebPageTraceListener

  1. 打开应用程序的 Web.config 文件。

  2. 将以下代码放入 Web.config 文件中的 <system.web> 节之后。

    <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>
    

    该配置节会将一个 WebPageTraceListener 对象添加到应用程序的跟踪侦听器集合中。

使用应用程序的配置文件添加 WebPageTraceListener 是添加跟踪侦听器的推荐方法。不过,也可以以编程方式添加跟踪侦听器。在使用复杂的跟踪逻辑和不同类型的跟踪侦听器跟踪应用程序并且 WebPageTraceListener 只是众多跟踪侦听器类型中的一种时,这种方法尤为有用。

若要以编程方式将跟踪侦听器添加到应用程序,请按照下列步骤操作创建一个 Global.asax 文件并添加侦听器。

以编程方式创建 Global.asax 文件并添加跟踪侦听器

  1. 打开文本编辑器(如记事本),并创建一个新文件。

  2. 在该文件中输入以下代码。

    <%@ Application Language="VB" %>
    <%@ Import Namespace="System.Web" %>
    
    <script runat="server">
      Sub Application_Start(sender As Object, e As EventArgs) 
        ' Code that runs when the application is started.
      End Sub
    
      Sub Application_End(sender As Object, e As EventArgs)
        ' Code that runs when the application shuts down.
      End Sub    
    </script>
    
    <%@ Application Language="C#" %>
    <%@ Import Namespace="System.Web" %>
    
    <script runat="server">
    
        void Application_Start(Object sender, EventArgs e) {
            // Code that runs when the application is started.
        }
    
        void Application_End(Object sender, EventArgs e) {
            // Code that runs when the application shuts down.
        }        
    </script>
    
  3. 在应用程序根目录中,将该文件保存为 Global.asax。

    这将创建一个基本的 Global.asax 文件,该文件是一个编译好的模块,其中包含无论应用程序在何时启动或停止都会运行的代码。

  4. 在 Global.asax 文件的 Application_Start 方法中输入以下代码。

    ' Create a trace listener for Web forms.
    Dim gbTraceListener As New WebPageTraceListener()
    ' Add the event log trace listener to the collection.
    System.Diagnostics.Trace.Listeners.Add(gbTraceListener)
    
    // Create a trace listener for Web forms.
    WebPageTraceListener gbTraceListener = new WebPageTraceListener();
    // Add the event log trace listener to the collection.
    System.Diagnostics.Trace.Listeners.Add(gbTraceListener);
    

    这将以编程方式将一个 WebPageTraceListener 添加到应用程序的跟踪侦听器集合中。

  5. 在 Default.aspx 所在的同一目录中,将该文件保存为 Global.aspx。

通过上述这些步骤,您已将 WebPageTraceListener 添加到应用程序的跟踪侦听器集合中。尽管每当启用页跟踪时 ASP.NET 就会显示跟踪消息,但只有在使用显式编译器开关(即 TRACE 开关)编译了跟踪消息所在的代码的情况下,才能写入 System.Diagnostics 跟踪消息。换句话说,如果未使用 TRACE 开关显式编译 AuthorClass,则看不到这些跟踪消息,即使添加了 WebPageTraceListener 也是如此。

通过向 Web.config 文件中添加一个新节,可以将应用程序配置为自动使用 TRACE 开关进行编译。

在自动启用跟踪的情况下编译应用程序

  1. 打开应用程序的 Web.config 文件。

  2. 将以下代码放入 Web.config 文件中的 <system.diagnostics> 节之后。

    <system.codedom>
      <compilers>
        <compiler language="c#;cs;csharp" 
                  extension=".cs" 
                  compilerOptions="/d:TRACE"
                  type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="1" />
        <compiler language="VB"
                  extension=".vb" 
                  compilerOptions="/d:Trace=true"
                  type="Microsoft.VisualBasic.VBCodeProvider, System,                                        Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </compilers>
    </system.codedom>
    

    默认情况下,此配置节使应用程序使用 TRACE 选项编译所有模块。

如果现在查看 Default.aspx 页,将会同时看到 ASP.NET 和 System.Diagnostics 跟踪消息。如果未出现 ASP.NET 和 System.Diagnostics 跟踪消息,则可能必须重新编译 AuthorClass 对象。

从跟踪信息中,可以了解到在该网页生存周期的 PreRender 方法期间,创建了 AuthorClass 对象并调用了其 GetAuthors 方法。还可以了解到在创建 AuthorClass 对象时存在很大的时间滞后;在“开始 PreRender”消息和“已创建 AuthorClass。”消息之间存在很大的时间差。这是因为 AuthorClass 在创建期间打开了 Authors.xml 文件并初始化了其 DataSet,这一操作是开销相对较大的操作。

在下一节中,您将学习如何配置 ASP.NET Web 应用程序以将所有跟踪消息传送到 .NET Framework 跟踪输出。

将所有跟踪输出传送到 .NET Framework 跟踪

您可能希望将 ASP.NET 跟踪消息传送到 Trace 消息的标准输出,它可以是控制台窗口、磁盘、Windows 事件日志或任何其他跟踪消息输出。在 Web.config 配置文件中可以启用此消息传送功能。

将所有 ASP.NET 跟踪消息传送到系统跟踪输出

  1. 打开应用程序的 Web.config 文件。

  2. 将一个新属性 writeToDiagnosticsTrace 添加到 <system.web> 下的跟踪元素,然后将 writeToDiagnosticsTrace 设置为 true。

        <system.web>
          <trace writeToDiagnosticsTrace="true"/>
          <customErrors mode="Off"/>
        </system.web>
    

    此配置属性指示 ASP.NET 跟踪将 ASP.NET 跟踪消息传送到标准的系统跟踪输出机制。

    若要在 ASP.NET 页外部的上下文中查看 ASP.NET 和 System.Diagnostics 跟踪消息,请使用 TextWriterTraceListener 对象将这些跟踪消息写入一个文件中。

    必须将 TextWriterTraceListener 对象配置为写入特定的文件。通过使用 <trace> -> <listeners> -> <add> 元素 的 initializeData 属性可以执行此操作。

  3. 按照本演练前面“将所有跟踪输出传送到 Web 窗体”的第二个过程中添加 WebPageTraceListener 对象的相同步骤操作,将一个 TextWriterTraceListener 对象添加到 Web.config 文件中,然后将 TextWriterTraceListener 配置为写入应用程序根目录中名为 Asptesttrace.log 的文件内。

    如果假定未在 Global.asax 文件中以编程方式添加 WebPageTraceListener,则 Web.config 文件的 <system.diagnostics> 节将如下所示:

    <system.diagnostics>    
      <trace autoflush="true">
        <listeners>
          <add name="WebPageTraceListener" 
            type="System.Web.WebPageTraceListener, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
          <add name="TestTracer" 
            type="System.Diagnostics.TextWriterTraceListener, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
            initializeData="<app root directory>\Asptesttrace.log" />
        </listeners>
      </trace>
    </system.diagnostics>
    
    b0ectfxd.alert_note(zh-cn,VS.90).gif说明:

    上一步中的 initializeData 属性有一个对应于 ASP.NET 应用程序根目录的占位符值。如果尝试将跟踪消息写入应用程序根目录之外的文件,就可能会收到安全异常。默认情况下,ASP.NET 不允许将文件写入应用程序根目录之外的磁盘位置,如 C:\。此外,还可能必须向 ASP.NET 辅助进程帐户授予对跟踪日志的写权限。

    默认情况下,必须等待填充跟踪缓冲区后,才能将跟踪数据写入目标流。

  4. 若要在请求 ASP.NET 页后立即查看跟踪日志中的跟踪数据,请在每次写入跟踪时刷新该缓冲区,方法是将 autoflush 属性设置为 true,就像前面步骤那样。

    autoflush 属性的默认值为 false。

  5. 若要以编程方式刷新跟踪信息的缓冲区,请调用 Flush 方法。

    b0ectfxd.alert_note(zh-cn,VS.90).gif说明:

    对于在本演练中开发的业务对象,如果在 Page_Load 方法中调用 Flush 方法并且 autoflush 属性为 false,则跟踪日志将不会显示跟踪数据,因为业务对象在页的 Load 事件发生后呈现。

后续步骤

本演练阐释了如何使用 ASP.NET 和 System.Diagnostics 跟踪功能将所有跟踪消息传送到单个输出。您可能希望从跟踪侦听器、输出及 ASP.NET 检测功能中获得更多的体验。例如,您可能希望执行下列操作:

  • EventLogTraceListener 对象添加到应用程序中。

    为此,您需要以编程方式添加一个 EventLogTraceListener 对象,或者通过使用配置文件(该配置文件使用与添加 WebPageTraceListener 相同的过程)来添加这样的对象。您可以打开事件日志查看应用程序写入事件日志中的跟踪消息。

  • 将业务组件更改为使用数据库数据而不是 XML 文件。您无需对页面上的控件进行任何更改。

请参见

其他资源

ASP.NET 跟踪

读取 ASP.NET 跟踪信息

应用程序级别 ASP.NET 跟踪概述