扩展 ASP.NET 运行状况监视事件
更新:2007 年 11 月
您可以执行下列任务来扩展 ASP.NET 运行状况监视功能。
通过从标准的 Web 事件类型进行继承来创建一个自定义 Web 事件类。注意,如果您的应用程序继承自 WebBaseEvent 或 WebBaseErrorEvent,该应用程序必须以部分信任权限运行。对于所有其他事件,该应用程序必须以完全信任权限运行。若要将自定义数据添加到自定义事件,请重写 FormatCustomEventDetails 方法。不要重写 ToString 方法。这是为了避免覆盖或纂改敏感的系统信息。必须通过调用 Raise 方法显式引发自定义事件。(标准事件只能由 ASP.NET 引发。)有关代码示例,请参见如何:实现和引发自定义 ASP.NET 运行状况监视事件。
通过创建一个实现 IWebEventCustomEvaluator 接口的类,自定义一个标准事件类型。
通过创建一个继承 WebEventProvider 或 BufferedWebEventProvider 类的类,创建一个用于处理事件的自定义提供程序。如果您的提供程序执行日志记录,则您还可以使用 WebEventFormatter 类。自定义事件提供程序可用于向自定义日志文件记录事件,向第三方应用程序发送事件数据等。有关代码示例,请参见如何:实现运行状况监视自定义提供程序示例。
缓冲 ASP.NET 运行状况监视事件
可以对 SQL 和邮件运行状况监视事件提供程序(SqlWebEventProvider、SimpleMailWebEventProvider 和 TemplatedMailWebEventProvider)进行配置,以使用事件缓冲。这样有助于减少频繁发送电子邮件或频繁执行 SQL 服务器插入操作对应用程序性能的影响。通过缓冲运行状况监视事件,还可以保护 SMTP 服务器和 SQL Server,以防在出现大量事件时导致繁重的负载。
SQL 事件提供程序缓冲
如果对 SQL 事件提供程序启用缓冲,它会先根据指定的缓冲模式对事件信息进行缓冲,然后再通过批处理操作将其插入数据库。
默认情况下,SqlWebEventProvider 提供程序并未配置为使用缓冲。每次引发事件时,其信息将立即插入数据库。通过在指定 SQL 提供程序的 Web.config 文件的 providers 元素中启用缓冲,可以重写此默认设置。具体方法是将 add 元素的 buffer 属性设置为 true。如果您配置了自己的 SQL 提供程序(即不使用 SqlWebEventProvider),且未指定 buffer 属性的值,则默认值为 true。
通过选择预定义的缓冲模式,可以对缓冲行为进行自定义。或者,可以向 bufferModes 集合中添加自定义元素。每个元素都定义了各种属性,如缓冲区的大小,以及刷新缓冲区的频率。然后,可以配置该提供程序以使用已经定义的缓冲模式之一。
下面的示例演示启用缓冲的 SQL 事件提供程序的配置设置。
说明: |
---|
AnalysisbufferModes 元素已经在根 Web.config 文件中配置,不需要在应用程序级 Web.config 文件中重新进行声明。SqlWebEventProviderproviders 元素也在根 Web.config 文件中做了配置,但是 buffer 属性设置为 false,并且 bufferMode 属性设置为 Notification。因此,必须在应用程序级 Web.config 文件中声明此示例演示的 providers 元素。此外,还必须使用 clear 或 remove 元素移除 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> 元素(网络设置)。
说明: |
---|
在配置文件中存储明文密码会有安全风险。如果将凭据保存在配置文件中,则应该使用受保护的配置对 <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 之间的连接
ASP.NET 运行状况监视功能为运行状况事件和 WMI 之间的连接提供基础结构。为此,它将这些事件映射到 WMI 类,以便可以将这些事件视为 WMI 对象。它还提供对处理运行状况事件及将它们调度到 WMI 系统的支持。有关如何将 ASP.NET 事件映射到 WMI 的详细信息,请参见演练:侦听 ASP.NET 运行状况监视过程中的 WMI 事件。有关 WMI 的更多信息,请参见位于 MSDN 网站上的 Windows Management Instrumentation。
下面的列表描述了通过 WMI 监视运行状况事件所需的步骤:
定义 Web 事件类与 WMI 对象之间的映射。对于每个标准 Web 事件类,此步骤已自动完成。这些映射包含在 ASP.NET 的托管对象格式 (MOF) 文件(即 %SystemRoot%\Microsoft.NET\Framework\<version>\aspnet.mof 文件)中。
说明: 将所有自定义事件映射到 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(托管对象格式)。
定义一个将处理这些事件的 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>
在该配置文件的 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>
创建一个用于侦听 WMI 事件的应用程序,或者使用第三方应用程序。
演练:侦听 ASP.NET 运行状况监视过程中的 WMI 事件中的代码示例创建了一个控制台应用程序,只要引发 Web 事件,该应用程序就会显示事件信息。
自定义 WMI 运行状况事件基础结构
发生 Web 事件时,ASP.NET 运行状况监视系统会将其调度至 WmiWebEventProvider 对象。该提供程序对象将根据相关的 MOF 类定义处理事件并填充适当的数据。随后,该提供程序将通过非托管代码调用将此数据调度至 WMI 系统。
在将 Web 事件发送至 WMI 方面,只有一个自定义选项:是否创建在 ASP.NET 运行状况监视事件被作为 WMI 事件发出后使用它们的自定义应用程序。在此情况下,您需要做的配置更改只是按上面列出的步骤配置一个新的 rules 元素。您的应用程序将以 WMI 事件(由操作系统发出)形式侦听 ASP.NET 运行状况事件。有关更多信息,请参见演练:侦听 ASP.NET 运行状况监视过程中的 WMI 事件。
说明: |
---|
不能扩展 WmiWebEventProvider 类。可扩展的事件提供程序类只有 WebEventProvider 和 BufferedWebEventProvider 类。 |
实现自定义 ASP.NET 运行状况监视事件和提供程序
默认情况下,某些事件要么已经捕获到性能计数器或事件日志中,要么已经发送到 ASP.NET 跟踪系统。可以通过将其他事件映射到现有的提供程序来启用这些事件。有关更多信息,请参见 ASP.NET 运行状况监视概述中揅onsuming Web Events Using Event Providers
如果现有的 Web 事件或提供程序类均不满足需要,则可以扩展这些类。下表列出了一些可自定义 ASP.NET 运行状况监视的途径。
任务 |
实现 |
示例 |
---|---|---|
创建自定义 Web 事件类。 |
创建从 WebBaseEvent 继承的类,并实现 Raise 虚方法。若要将自定义数据添加到自定义事件,请重写 FormatCustomEventDetails 方法。 |
|
创建自定义事件提供程序以处理内置或自定义的 Web 事件。 |
创建从 WebEventProvider 类(或派生类之一)继承的类。如果提供程序执行记录操作,也可以从 WebEventFormatter 类继承。 |