ASP.NET 运行状况监视概述

更新:2007 年 11 月

利用 ASP.NET 运行状况监视功能,系统管理员可以监视已部署的 Web 应用程序的状态。

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

中度信任或更高的信任是引发运行状况监视事件所必需的。

本主题包括:

  • 方案

  • ASP.NET 运行状况监视功能

  • 背景

  • 代码示例

  • 类参考

方案

ASP.NET 运行状况监视可用于执行以下任务:

  • 监视应用程序的性能以确保其正常运行。

  • 快速诊断出现故障的应用程序或系统。

  • 评估应用程序的生命周期期间的重要事件。

  • 监视单个活动的 ASP.NET 应用程序,或者监视网络场中活动的 ASP.NET 应用程序。

  • 记录不一定与 ASP.NET 应用程序中的错误相关的事件。

返回页首

功能

ASP.NET 运行状况系统包括:

  • 对应用程序运行状况状态信息进行打包的事件类型。

  • 处理事件信息的提供程序类型。

  • 帮助管理运行状况事件的其他类型。

返回页首

背景

ASP.NET 运行状况监视提供了一种简便方法,使您可以轻松监视 ASP.NET 应用程序的运行状况,并获取有关 ASP.NET 资源的详细运行时信息(以检测应用程序)。运行状况监视包含即时可用的 Web 运行状况监视事件类(Web 事件),以及运行状况监视提供程序(侦听器)。Web 事件对运行状况事件信息进行打包。

提供程序负责侦听事件和使用事件信息,通常是记录信息或通知管理员。通过在应用程序的配置文件中进行设置,可以将 Web 事件连接到某个提供程序(称作启用事件)。

ASP.NET 运行状况监视系统是使用 System.Web.Management 命名空间中的类实现的。

配置 ASP.NET 运行状况监视

可以将应用程序配置为使用内置或自定义的监视提供程序,这些提供程序可以处理运行状况监视信息,并报告所检测的应用程序的运行状况状态和性能特性。

通过对配置文件中的 healthMonitoring 节进行配置,可以将 Web 事件和提供程序添加到应用程序。然后可以使用内置类或自定义类来侦听事件数据并进行处理。

有关配置文件的更多信息,请参见 ASP.NET 配置文件

Web 事件类层次结构

在引发 Web 事件时,将会创建关联事件类的一个实例。在该对象的属性中收集事件数据。事件提供程序将处理这些数据。

Web 事件可以包含有关辅助进程、应用程序域、请求数据、响应数据、应用程序错误、配置错误和审核事件的信息。包含在父事件类中的运行状况信息由任何子事件类继承。

Web 事件类之间的关系如下图所示。

Web 事件类层次结构
ASP.NET 运行状况监视

事件在 Web 事件类层次结构中的位置越深,传送给 ASP.NET 应用程序的数据就越具体。例如,派生类可以公开堆栈跟踪、客户端 IP 以及线程和进程信息之类的信息。

Web 事件信息

下表列出了有助于确定使用或继承哪个 Web 事件类的信息。各行指的是 Web 事件类。各列指的是信息类,这些类通常作为属性在 Web 事件类中提供。

如果您的应用程序不是在完全信任级别下运行,则只有 WebBaseEvent 类是可继承的。这有助于防止通过该表列出的信息类公开敏感信息。

Web 事件类

WebApplicationInformation

WebProcessInformation

WebProcessStatistics

WebRequestInformation

WebThreadInformation

WebBaseEvent

此类生成的数据。

不可用

不可用

不可用

不可用

WebManagementEvent

父类生成的数据

此类生成的数据。

不可用

不可用

不可用

WebHeartbeatEvent

父类生成的数据

父类生成的数据

此类生成的数据。

不可用

不可用

WebRequestEvent

父类生成的数据

父类生成的数据

不可用

此类生成的数据。

不可用

WebApplicationLifetimeEvent

父类生成的数据

父类生成的数据

不可用

不可用

不可用

WebBaseErrorEvent

父类生成的数据

父类生成的数据

不可用

不可用

不可用

WebErrorEvent

父类生成的数据

父类生成的数据

不可用

此类生成的数据。

此类生成的数据。

WebRequestErrorEvent

父类生成的数据

父类生成的数据

不可用

父类生成的数据

父类生成的数据

WebAuditEvent

父类生成的数据

父类生成的数据

不可用

此类生成的数据。

不可用

WebSuccessAuditEvent

父类生成的数据

父类生成的数据

不可用

父类生成的数据

不可用

WebAuthenticationSuccessAuditEvent

父类生成的数据

父类生成的数据

不可用

父类生成的数据

不可用

WebFailureAuditEvent

父类生成的数据

父类生成的数据

不可用

父类生成的数据

不可用

WebAuthenticationFailureAuditEvent

父类生成的数据

父类生成的数据

不可用

父类生成的数据

不可用

WebViewStateFailureAuditEvent

父类生成的数据

父类生成的数据

不可用

父类生成的数据

不可用

提供程序类层次结构

ASP.NET 包括可用于处理 Web 事件的内置提供程序。还可以从内置类继承以创建自定义提供程序,但需要遵从下面列出的继承限制:

无论信任级别如何,其他类均不能由应用程序继承。有关更多信息,请参见各个提供程序类的类概述。

下图显示了 System.Web.Management 命名空间的 Web 提供程序类之间的关系。

Web 提供程序类层次结构
ASP .NET 运行状况监控提供程序类示意图

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

可以采用下列方式来使用 ASP.NET 运行状况监视事件:

  • 使用内置的 Web 事件和提供程序类。通常,您不需要提供任何 ASP.NET Web 事件类的自定义实现。注意,应用程序不会引发这些事件,而是由 .NET Framework 引发。但是,必须按本主题后面的说明进行配置。有关更多信息,请参见如何:发送运行状况监视通知电子邮件

  • 为 Web 事件或提供程序创建自定义类。如果需要向内置 Web 事件已提供的信息追加自定义信息,通常需要创建自定义 Web 事件。如果希望通过内置提供程序提供的机制以外的其他机制传送事件数据,通常需要创建自定义提供程序。有关更多信息,请参见 扩展 ASP.NET 运行状况监视事件

使用内置 Web 事件和提供程序

使用内置 Web 事件和提供程序来进行运行状况监视是最为常用的策略。这只需要将应用程序配置为使用您需要的事件和提供程序。必须进行以下操作:

  • 将您需要的内置 ASP.NET Web 事件类添加到应用程序配置文件的 healthMonitoring 节中的 eventMappings 元素。

  • healthMonitoring 节的 providers 元素添加使用该事件的提供程序。

  • rules 元素添加一个定义事件与提供程序之间的关联的项。

默认情况下,内置 ASP.NET 运行状况监视类在根 Web.config 文件的 healthMonitoring 节中配置。healthMonitoring 节建立以下默认配置:

EventLogWebEventProviderWmiWebEventProviderSqlWebEventProvider 事件提供程序在 providers 元素中指定。可以在 providers 元素中指定其他内置提供程序,例如 SimpleMailWebEventProviderTemplatedMailWebEventProviderTraceWebEventProvider 类。

将 Web 错误和审核失败事件与 EventLogWebEventProvider 类相关联的规则在 rules 元素中指定。可以通过添加更多 rules 元素来启用其他 Web 事件和提供程序。如果事件映射到 rules 元素中的事件提供程序,则认为该事件视作已启用。必须为事件配置 eventMappingsproviders 元素,但除非两者在 rules 元素中连接,否则不会启用事件。

可以为配置的项指定参数值。示例包括用于限制可发生的事件数的参数、用于指定两个事件之间的时间间隔的参数,或用于指定 SQL 和邮件提供程序的事件缓冲选项的参数。

配置自定义提供程序

如果需要自定义 Web 事件信息的处理,则可以生成自定义的运行状况事件提供程序。您的提供程序是一个从 WebEventProviderBufferedWebEventProvider 类继承的类。有关示例,请参见 如何:实现运行状况监视自定义提供程序示例。创建自定义提供程序是最常见的运行状况监视自定义。它需要您按以下方式修改配置文件:

  • 向配置文件中 healthMonitoring 节的 providers 元素添加处理该事件的自定义提供程序。

  • rules 元素添加一个定义事件与提供程序之间的关联的项。

  • 将包含自定义提供程序实现的程序集放置在应用程序的 Bin 子目录中。不能将提供程序源代码文件放在 App_Code 子目录中,因为运行状况监视系统是在编译 App_Code 子目录中的任何代码文件之前配置和创建的。

providers 元素的 type 属性至少需要一个类名。如果程序集不在应用程序的 Bin 目录中,则该程序集必须具有强名称并且安装在全局程序集缓存中。在这种情况下,providers 元素的 type 属性需要完整的强名称(如下面的示例所示),其中 Version 和 PublicKeyToken 值与您的程序集匹配:

type="Microsoft.Samples.Web.Management.SampleCustomEventProvider, Sample.SampleCustomEventProvider,Version=n.n.n.n,Culture=neutral, PublicKeyToken=xxxx"

下面的示例演示如何将 SampleCustomEventProvider 提供程序与 WebHeartbeatEvent 事件相关联。Heartbeats 事件已在根 Web.config 文件中配置。

<healthMonitoring 
  heartBeatInterval="1" 
  enabled="true">
  <rules>
    <add 
      name="Heartbeat Events" 
      eventName="Heartbeats" 
      provider="Sample Custom Event Provider"
      profile="Default" 
      minInstances="1" 
      maxLimit="Infinite" 
      minInterval="00:01:00"
      custom="" 
    />
  </rules>
  <providers>
    <add 
      name="Sample Custom Event Provider" 
      type="Microsoft.Samples.Web.Management.SampleCustomEventProvider, Sample.SampleCustomEventProvider,Version=1.0.0.0,Culture=neutral, PublicKeyToken=xxxxxxxxxxxx" 
    />
  </providers>
</healthMonitoring>

配置自定义事件

如果需要自定义运行状况事件信息,您可以生成一个自定义运行状况事件。有关示例,请参见如何:实现和引发自定义 ASP.NET 运行状况监视事件。创建自定义 Web 事件的情况比创建自定义提供程序的情况要少见。这需要您修改配置文件。还必须在适当时间显式引发自定义事件。

若要配置该事件,必须执行以下各项操作:

  • healthMonitoring 节的 eventMappings 元素添加自定义运行状况事件类。

  • 添加一个定义事件与提供程序之间的关联的 rules 元素。

  • 将包含自定义 Web 事件实现的程序集添加到 ASP.NET 应用程序的 Bin 子目录。或者,也可将事件源代码文件添加到 App_Code 子目录。

如果使用程序集,则 eventMappings 元素的 type 属性至少需要类名和程序集文件名,如下面的代码示例所示:

type="System.Web.Management.SampleCustomWebEvent, Sample.SampleCustomWebEvent"

如果使用源代码文件,则仅需指定类名。

下面的示例演示如何将 EventLogWebEventProvider 事件提供程序与名为 SampleCustomWebEvent 的自定义事件相关联。EventLogProvider 事件提供程序已在根 Web.config 文件中配置。

<healthMonitoring 
  heartBeatInterval="0" 
  enabled="true">
  <rules>
    <add 
      name="Sample Custom Events" 
      eventName="SampleCustomWebEvent" 
      provider="EventLogProvider"
      profile="Default" 
      minInstances="1" 
      maxLimit="Infinite" 
      minInterval="00:01:00"
      custom="" 
    />
  </rules>
  <eventMappings>
    <add 
      name="SampleCustomWebEvent" 
      type="System.Web.Management.SampleCustomWebEvent, Sample.SampleCustomWebEvent,Version=1.0.0.0,Culture=neutral, PublicKeyToken=xxxxxxxxxxxx" "
      startEventCode="0" 
      endEventCode="2147483647" 
    />
  </eventMappings>
</healthMonitoring>

保证 ASP.NET 运行状况监视的安全

默认情况下,将为 ASP.NET 应用程序启用运行状况监视功能。通过将 healthMonitoring 元素的 enabled 属性设置为 false,您可以禁用运行状况监视。默认配置设置将设为最安全的可用值。有关运行状况监视配置设置的更多信息,请参见 healthMonitoring。考虑使用 location 元素锁定运行状况监视配置设置。

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

实现自定义事件使用者或自定义事件提供程序时,必须进行编码或检查事件内容,以免出现跨站点脚本问题。

保证配置值的安全

在应用程序的配置文件中存储敏感信息时,应使用受保护的配置对敏感值进行加密。特别敏感的信息包括存储在 machineKey 配置元素中的加密密钥,以及存储在 connectionStrings 配置元素中的用来连接数据源的连接字符串。有关更多信息,请参见使用受保护的配置加密配置信息

只有使用中等及更高信任级别的代码才能访问 healthMonitoring 配置节。这可防止低信任级别的应用程序注册自定义类型。

扩展运行状况监视的安全性

System.Web.Management 命名空间中的运行状况监视类型具有下列特性:

  • 基类构造函数标记为 protectedinternal。因此,不能由用户代码直接创建基类事件类型的实例。

  • 对 Web 事件实例的访问限制为配置指定的提供程序、筛选器和模板页。

  • 具有受保护内容的事件要求使用继承链接,这一点可确保只能派生完全受信任的自定义事件。

  • 公开受保护事件属性中敏感数据的自定义受信任事件自身必须实施代码访问安全性,以避免诱饵式攻击。有关代码访问安全性的详细信息,请参见 ASP.NET 代码访问安全性代码访问安全性基础知识

  • 用于查看 Web 事件的 Windows Management Instrumentation (WMI) 类型被锁定,以防止所有用户访问事件数据。

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

    实现自定义事件使用者或自定义事件提供程序时,必须进行编码或检查事件内容,以免出现跨站点脚本问题。

保护到数据源的连接

您可以创建自定义运行状况监视事件提供程序,以便将事件数据记录到数据库。ASP.NET 包含一个 SQL 提供程序。有关如何记录事件数据的更多信息,请参见保证数据访问的安全

若要帮助确保与数据库服务器的连接,应使用受保护配置,对配置文件中的连接字符串信息进行加密。有关更多信息,请参见 使用受保护的配置加密配置信息

使用 SQL 提供程序时,必须使用身份验证来适当地保护数据库。必须通过使用访问控制列表 (ACL) 和 SQL 身份验证来保护 Microsoft SQL Server Express Edition 文件。

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

在将事件记入数据库时,不应使用非特权帐户来运行 SQL Server Express Edition。

防范拒绝服务攻击

Web 事件可以由可生成异常或事件的 HTTP 请求或应用程序代码触发。大量事件或大型事件可能会超过事件提供程序的处理能力。在此情况下,这些事件可能会占满 ASP.NET 应用程序或服务器,从而可能影响内存使用、磁盘空间和网络流量。

为了减小应用程序受到拒绝服务攻击的可能性,默认情况下,ASP.NET 使用以下设计:

  • ASP.NET 每分钟量出一个事件实例。该调节频率是在 profiles 元素中配置的,并且与 rules 元素中的事件和提供程序关联。

  • 每种提供程序类型的事件缓冲相互隔离,以避免争用缓冲区空间。缓冲区设置在 bufferModes 元素中配置。可以通过指定包含相应设置的 bufferModes 元素,将提供程序配置为使用一组特定的缓冲区设置。

  • 若要引发自定义事件,需要中等或更高的信任级别。

系统管理员可以配置调节和缓冲设置以避免溢出,特别是对于可以由 HTTP 请求触发的事件。此外,可以设置单独的缓冲区模式,分别处理重要事件和不重要的事件。

错误消息和事件的安全性

若要防止向不必要的源公开敏感信息,可将应用程序配置为不显示详细的错误消息。也可以将应用程序配置为仅当客户端是 Web 服务器本身时才显示详细错误消息。有关更多信息,请参见 customErrors

默认情况下,ASP.NET 将每个请求的大量异常性 Web 事件记录到性能监视系统。在默认配置中,这意味着失败的登录尝试将在“应用程序”事件日志中记录用户名和其他诊断信息。可以在 Windows 事件查看器中查看这些数据。如果服务器正在运行 Microsoft Windows Server 产品之一,则可以通过保护事件日志来提高应用程序的安全性。还可以设置参数来指定事件日志的大小、保留方式以及其他特性,以防止间接拒绝服务攻击。

锁定 ASP.NET 运行状况监视配置

在应用程序托管的情况下,通常需要锁定站点上的某些设置以防止修改。例如,可能需要锁定被托管的应用程序的运行状况监视设置,以降低意外修改 Web 应用程序配置的风险。

通过在 allowOverride="false" 标记中添加 allowOverride="false" 属性可以锁定配置设置。如果层次结构中较低位置的配置文件尝试重写 location 元素中定义的任何配置节,则将导致配置系统引发错误。

下面的示例配置文件演示如何锁定一个名为 application1 的 ASP.NET 应用程序的 healthMonitoring 节。这些设置可以存储在服务器级别(machine.config 文件中)或站点级别。

<configuration>
  <location path="application1" allowOverride="false">
    <system.web>
      <healthMonitoring
        enabled="true"
        heartBeatInterval="60">
        <bufferModes>
          <add name="Logging"
            maxBufferSize="1000"
            maxFlushSize="200"
            urgentFlushThreshold="800"
            regularFlushInterval="00:30:00"
            urgentFlushInterval="00:05:00"
            maxBufferThreads="1"
          />
        </bufferModes>
        <providers>
           <add name="EventLogProvider"
            type="System.Web.Management.EventLogWebEventProvider, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%"
            buffer="true"
            bufferMode="Logging"
          />
        </providers>
        <eventMappings>
          <add name="All Errors"
            type="System.Web.Management.WebBaseErrorEvent, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%" 
          />
        </eventMappings>
        <profiles>
          <add name="Default"
            minInstances="1"
            maxLimit="Infinite"
            minInterval="00:10:00"
          />
        </profiles>
        <rules>
          <add name="All Errors Default"
            eventName="All Errors"
            provider="EventLogProvider"
            profile="Default"
            minInterval="00:01:00" 
          />
        </rules>
      </healthMonitoring>
    </system.web>
  </location>
</configuration>

使用 lockItem、lockAttributes、lockElements 等其他属性可以更细的粒度锁定元素。有关更多信息,请参见节元素所继承的常规属性

返回页首

代码示例

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

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

如何:发送运行状况监视通知电子邮件.

演练:侦听 ASP.NET 运行状况监视过程中的 WMI 事件

返回页首

类参考

返回页首

请参见

任务

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

概念

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

ASP.NET 配置概述

参考

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

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