扩展 ASP.NET 运行状况监视事件

更新:2007 年 11 月

您可以执行下列任务来扩展 ASP.NET 运行状况监视功能。

缓冲 ASP.NET 运行状况监视事件

可以对 SQL 和邮件运行状况监视事件提供程序(SqlWebEventProviderSimpleMailWebEventProviderTemplatedMailWebEventProvider)进行配置,以使用事件缓冲。这样有助于减少频繁发送电子邮件或频繁执行 SQL 服务器插入操作对应用程序性能的影响。通过缓冲运行状况监视事件,还可以保护 SMTP 服务器和 SQL Server,以防在出现大量事件时导致繁重的负载。

SQL 事件提供程序缓冲

如果对 SQL 事件提供程序启用缓冲,它会先根据指定的缓冲模式对事件信息进行缓冲,然后再通过批处理操作将其插入数据库。

默认情况下,SqlWebEventProvider 提供程序并未配置为使用缓冲。每次引发事件时,其信息将立即插入数据库。通过在指定 SQL 提供程序的 Web.config 文件的 providers 元素中启用缓冲,可以重写此默认设置。具体方法是将 add 元素的 buffer 属性设置为 true。如果您配置了自己的 SQL 提供程序(即不使用 SqlWebEventProvider),且未指定 buffer 属性的值,则默认值为 true。

通过选择预定义的缓冲模式,可以对缓冲行为进行自定义。或者,可以向 bufferModes 集合中添加自定义元素。每个元素都定义了各种属性,如缓冲区的大小,以及刷新缓冲区的频率。然后,可以配置该提供程序以使用已经定义的缓冲模式之一。

下面的示例演示启用缓冲的 SQL 事件提供程序的配置设置。

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

AnalysisbufferModes 元素已经在根 Web.config 文件中配置,不需要在应用程序级 Web.config 文件中重新进行声明。SqlWebEventProviderproviders 元素也在根 Web.config 文件中做了配置,但是 buffer 属性设置为 false,并且 bufferMode 属性设置为 Notification。因此,必须在应用程序级 Web.config 文件中声明此示例演示的 providers 元素。此外,还必须使用 clearremove 元素移除 SqlWebEventProvider 提供程序的高级配置。

在该示例中,SQL 事件提供程序配置为在启用缓冲时使用 Analysis 缓冲模式。该缓冲模式是在 bufferModes 元素中定义的。在这种模式下,该提供程序会每隔 5 分钟刷新一次事件信息。对于每个通知,它最多能刷新 100 个事件。如果事件的频率骤然增加,它将最多能缓冲 1000 个事件。该提供程序可保证事件的发送频率不会超过每分钟一次。

<healthMonitoring>
  <providers>
    <clear/>
    <add 
      ConnectionStringName="LocalSqlServer" 
      maxEventDetailsLength="1073741823"
      buffer="true" 
      bufferMode="Analysis" 
      name="SqlWebEventProvider"
      type="System.Web.Management.SqlWebEventProvider,System.Web, Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
    />
  </providers>
  <bufferModes>
    <add 
      name="Analysis" 
      maxBufferSize="1000" 
      maxFlushSize="100"
      urgentFlushThreshold="100" 
      regularFlushInterval="00:05:00"
      urgentFlushInterval="00:01:00" 
      maxBufferThreads="1"
    />
  </bufferModes>
</healthMonitoring>

电子邮件事件提供程序缓冲

如果对邮件事件提供程序启用缓冲,则该提供程序首先会缓冲事件,然后再以事件通知的形式发送电子邮件。如果配置了电子邮件事件提供程序,但并未指定其 add 元素的 buffer 属性值,则默认值为 true。通过将 buffer 属性设置为 false,可以禁用缓冲。

通过选择预定义的缓冲模式,可以对缓冲行为进行自定义。或者,可以向 bufferModes 集合中添加自定义元素。每个元素都定义了各种属性,如缓冲区的大小,以及刷新缓冲区的频率。然后,可以配置该提供程序以使用已经定义的缓冲模式之一。建议您使用 CriticalNotification 模式。

下面的示例演示已为 SimpleMailWebEventProvider 类禁用缓冲但为 TemplatedMailWebEventProvider 类启用缓冲的电子邮件事件提供程序的配置设置。TemplatedMailWebEventProvider 提供程序配置为使用 CriticalNotification 缓冲模式。该模式已经在根 Web.config 文件中进行了配置。在 CriticalNotification 模式下,提供程序在收到事件时会尝试刷新所有事件信息。但是,这种刷新尝试的成功频率不会超过每分钟一次,以免为电子邮件服务器带来大量负载。消息的大小应适于管理。该信息至多容纳 20 个事件。

如果运行状况监视系统收到的事件信息超过了允许的最大值,它会在生成新的事件时丢弃最早的事件。随着缓冲区不断变满,运行状况监视系统将尝试提高刷新频率,以避免丢弃事件。但是,如果事件已被丢弃,它将不会再尝试为其发送任何信息(不过,它还是会在下次刷新时包括事件已丢弃的通知)。如果提供程序承担的负荷繁重,则较新事件的延迟时间最多为 5 分钟,前提是这些事件没有因为缓冲区已满而被丢弃。

<healthMonitoring>
  <providers>
    <!-- mail provider with attributes that are always relevant -->
    <add 
      name="SimpleMailWebEventProvider" 
      type="System.Web.Management.SimpleMailWebEventProvider"
      to="SystemAdministrator@contoso.com"
      from="HealthMonitoring@contoso.com"
      buffer="false" 
    />
    <!-- mail provider with attributes that are relevant only 
         when buffering is enabled -->
    <add 
      name="SampleTemplatedMailWebEventProvider" 
      type="System.Web.Management.TemplatedMailWebEventProvider"
      to="SystemAdministrator@contoso.com" 
      from="HealthMonitoring@contoso.com" 
      buffer="true" 
      bufferMode="Critical Notification"
      template="Template.aspx" />
  </providers>
  <bufferModes>
    <add 
      name="Critical Notification" 
      maxBufferSize="100" maxFlushSize="20"
      urgentFlushThreshold="1" 
      regularFlushInterval="Infinite" 
      urgentFlushInterval="00:01:00"
      maxBufferThreads="1"
    />
  </bufferModes> 
</healthMonitoring>

若要此示例正确运行,必须在配置文件中配置 SMTP 服务器,如下面的示例所示。

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network 
        defaultCredentials="true" 
        host="127.0.0.1" 
        port="25" 
        username="username" 
        password="password" />
    </smtp>
  </mailSettings>
</system.net>

有关更多信息,请参见 <mailSettings> 元素(网络设置)

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

在配置文件中存储明文密码会有安全风险。如果将凭据保存在配置文件中,则应该使用受保护的配置对 <mailSettings> 配置元素的内容进行加密。有关更多信息,请参见使用受保护的配置加密配置信息

缓冲模式设置

通过在 bufferModes 元素中设置 add 元素的下列属性,可以指定缓冲行为:

  • regularFlushInterval 常规事件信息刷新时间间隔。

  • urgentFlushThreshold 刷新缓冲区之前应缓冲其信息的事件数。

下面的设置指定了提供程序向事件接收器所做的保证。

  • maxBufferSize 缓冲区将保留其信息的最大事件数。如果缓冲区中的事件数超过该值,将会丢弃较早的事件。

  • maxFlushSize 提供程序一次刷新其信息的最大事件数。

  • urgentFlushInterval 提供程序在执行其他紧急刷新之前要等待的最短时间。如果自上次刷新以来尚未经过 urgentFlushInterval 属性表示的时间,但缓冲区已满,则从缓冲区中丢弃较早事件的信息。提供程序会跟踪丢弃的事件数,并在下一个事件通知中包含一则警告。

使用 WMI 跟踪 ASP.NET 运行状况监视事件

监视 ASP.NET 运行状况事件的一种方法是使用 Windows Management Instrumentation (WMI) 事件提供程序 WmiWebEventProvider 类。此提供程序将 Web 运行状况监视事件(Web 事件)转换为 WMI 事件。WMI 提供了一个标准对象模型,您要监视的实体在该模型中可以表示为对象。这些实体包括计算机、网卡、打印机、软件应用程序等。它们将映射到 WMI 对象模型中,以便使用自定义应用程序对其进行监视。下图显示了 ASP.NET Web 事件、WMI 及侦听 WMI 事件的使用者应用程序之间的关系。

ASP.NET 与 WMI 之间的关系
WMI 体系结构

运行状况事件和 WMI 之间的连接

ASP.NET 运行状况监视功能为运行状况事件和 WMI 之间的连接提供基础结构。为此,它将这些事件映射到 WMI 类,以便可以将这些事件视为 WMI 对象。它还提供对处理运行状况事件及将它们调度到 WMI 系统的支持。有关如何将 ASP.NET 事件映射到 WMI 的详细信息,请参见演练:侦听 ASP.NET 运行状况监视过程中的 WMI 事件。有关 WMI 的更多信息,请参见位于 MSDN 网站上的 Windows Management Instrumentation

下面的列表描述了通过 WMI 监视运行状况事件所需的步骤:

  1. 定义 Web 事件类与 WMI 对象之间的映射。对于每个标准 Web 事件类,此步骤已自动完成。这些映射包含在 ASP.NET 的托管对象格式 (MOF) 文件(即 %SystemRoot%\Microsoft.NET\Framework\<version>\aspnet.mof 文件)中。

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

    将所有自定义事件映射到 WMI 中的基本事件类型。不能将自定义 ASP.NET 运行状况监视事件映射到任意 WMI 事件。

    例如,下面的代码演示映射到 WebHeartbeatEvent 类型的 WMI 类的定义。

    class HeartbeatEvent : ManagementEvent {
        /*
         * ProcessStatistics    
         */
        DATETIME    ProcessStartTime;
        sint32      ThreadCount;
        sint64      WorkingSet;
        sint64      PeakWorkingSet;
        sint64      ManagedHeapSize;
        sint32      AppdomainCount;    
        sint32      RequestsExecuting;
        sint32      RequestsQueued;
        sint32      RequestsRejected;
    }; 
    

    有关 MOF 文件的更多信息,请参见位于 MSDN 上的 WMI SDK 中的 Managed Object Format(托管对象格式)。

  2. 定义一个将处理这些事件的 ASP.NET 运行状况监视提供程序。

    标准提供程序是 WmiWebEventProvider 类。默认情况下,此设置已在根 Web.config 文件的 healthMonitoring 节中用以下元素配置:

    <providers>
      <add 
        name="WmiWebEventProvider" 
        type="System.Web.Management.WmiWebEventProvider,System.Web, Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
      />
    </providers>
    
  3. 在该配置文件的 healthMonitoring 节中输入适当的设置,以创建 Web 事件类与 WMI 事件提供程序 WmiWebEventProvider 类之间的关联。

    默认情况下,WMI 事件提供程序未订阅 Web 事件。通过在应用程序级 Web.config 文件中使用下列元素,可以使 WMI 事件提供程序订阅所有 Web 事件。默认情况下,All Events 事件类型在根 Web.config 文件的 eventMappings 元素中配置。该事件类型会映射到 WebBaseEvent 类。

    <rules>
      <add 
        name="Testing Wmi"
        eventName="All Events" 
        provider="WmiWebEventProvider" 
        profile="Critical"
      />
    </rules>
    
  4. 创建一个用于侦听 WMI 事件的应用程序,或者使用第三方应用程序。

    演练:侦听 ASP.NET 运行状况监视过程中的 WMI 事件中的代码示例创建了一个控制台应用程序,只要引发 Web 事件,该应用程序就会显示事件信息。

自定义 WMI 运行状况事件基础结构

发生 Web 事件时,ASP.NET 运行状况监视系统会将其调度至 WmiWebEventProvider 对象。该提供程序对象将根据相关的 MOF 类定义处理事件并填充适当的数据。随后,该提供程序将通过非托管代码调用将此数据调度至 WMI 系统。

在将 Web 事件发送至 WMI 方面,只有一个自定义选项:是否创建在 ASP.NET 运行状况监视事件被作为 WMI 事件发出后使用它们的自定义应用程序。在此情况下,您需要做的配置更改只是按上面列出的步骤配置一个新的 rules 元素。您的应用程序将以 WMI 事件(由操作系统发出)形式侦听 ASP.NET 运行状况事件。有关更多信息,请参见演练:侦听 ASP.NET 运行状况监视过程中的 WMI 事件

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

不能扩展 WmiWebEventProvider 类。可扩展的事件提供程序类只有 WebEventProviderBufferedWebEventProvider 类。

实现自定义 ASP.NET 运行状况监视事件和提供程序

默认情况下,某些事件要么已经捕获到性能计数器或事件日志中,要么已经发送到 ASP.NET 跟踪系统。可以通过将其他事件映射到现有的提供程序来启用这些事件。有关更多信息,请参见 ASP.NET 运行状况监视概述中揅onsuming Web Events Using Event Providers

如果现有的 Web 事件或提供程序类均不满足需要,则可以扩展这些类。下表列出了一些可自定义 ASP.NET 运行状况监视的途径。

任务

实现

示例

创建自定义 Web 事件类。

创建从 WebBaseEvent 继承的类,并实现 Raise 虚方法。若要将自定义数据添加到自定义事件,请重写 FormatCustomEventDetails 方法。

如何:实现和引发自定义 ASP.NET 运行状况监视事件

创建自定义事件提供程序以处理内置或自定义的 Web 事件。

创建从 WebEventProvider 类(或派生类之一)继承的类。如果提供程序执行记录操作,也可以从 WebEventFormatter 类继承。

如何:实现运行状况监视自定义提供程序示例

请参见

任务

如何:锁定 ASP.NET 配置设置

概念

ASP.NET 运行状况监视概述

ASP.NET 配置概述

参考

healthMonitoring 的 bufferModes 元素(ASP.NET 设置架构)

healthMonitoring 的 providers 元素(ASP.NET 设置架构)