ASP.NET 2.0 中 Web 事件

 

ASP.NET 2.0 还提供了全功能的应用程序监视和健康监视。这个系统是由一个完全可扩展事件模型和一个能将事件发送到多种接收器的事件引擎组成的。举例来说,您可以配置您的 ASP.NET 应用程序来每天发送电子邮件,表明服务器正在运行并且包括可用内存的数量。同样,您可以创建一个链接到未处理异常的健康事件。异常内容、请求标题以及时间和日期都可以被发送到一个错误日志记录数据库。
ASP.NET 2.0 包含了内置的事件,包括心跳、应用程序生存期事件(启动/停止/编译)和错误陷阱事件(未处理异常)。不过,,您可以很容易地在这些基类之上进行构建,以从应用程序重创建并引发您自己的事件。举例来说,您可能创建一个自定义的事件来记录何时第一百个用户单击某一特定的链接。


ASP.NET 2.0 健康监视系统真正强大的功能是,通过 web.config 和 machine.config 文件它是完全可配置的。使用正常的 XML,您能定义事件、定义提供程序(事件接收器),以及将特定的事件发送到特定的提供程序。


创建事件
事件在结构上与异常是类似的。也就是说,除了作为一个消息容器,event 类本身几乎没有功能。在健康监视方面,所有事件都从 Sytstem.Web.Management.WebBaseEvent 继承。不过,您也可以从用于专用目的(如收集 HTTP 请求数据或处理异常)的高级基类派生。


列表 4. 自定义事件


using System;
using System.Web.Management;


public class CustomEvent : WebBaseEvent
{
  public const int EventCode = WebEventCodes.WebExtendedBase + 10;
  public MyEvent(string message, object eventSource)
                : base(message, eventSource, EventCode)
  { }
}


创建自定义事件的最重要部分是提供一个唯一的 EventCode。所有内置事件代码都在 WebEventCodes 枚举中。自定义事件应该有从 WebEventCodes.WebExtendedBase + 1 开始的数字。除此之外创建自定义事件中的唯一常见任务是正确地初始化事件。


使用事件
虽然内置事件自动激发,但您还是可以将代码添加到应用程序以在任何时候启动自定义事件。


列表 5. 引发一个事件


<script runat=”server”>
   void Page_Load(Object sender, EventArgs e)
   { // Raise a custom event MyEvent myEvent =
          new MyEvent(“loading webevent sample page”, this); myEvent.Raise(); }
</script>


当您从 ASP.NET 页面引发一个事件时,您只是创建该事件的一个新实例然后执行 Raise() 方法。Raise() 方法将事件实例自动传递到健康监视引擎。然后此引擎将该事件映射到配置文件和提供程序,并将该事件移交给正确的提供程序。提供程序最终将事件传递到正确的接收器。


配置健康监视
健康监视是在 machine.Config 或 Web.Config 文件中的新的 区域配置的。您可以配置 部分来设置一个周期性报告应用程序状态的 Web 检测信号。您也可以配置应用程序来生成事件,并将该事件通过各种提供程序传递。


配置事件
必须在事件映射区域标识每个事件。事件通过唯一名称和完整类型被标识。事件名称在规则区域是作为链接来使用的。


列表 6. 事件映射区域


<!– Event mappings define the events that are monitored –>
<eventMappings>
     <add name=”SampleWebRequests”
          type=”Samples.AspNet.SampleWebRequestEvent, SampleWebRequestEvent,
                Version=0.0.0.0, Culture=neutral, PublicKeyToken=f0c63b9a560d5e5a”/>
</eventMappings>


ASP.NET 2.0 附带几个内置事件,配置为下列名称:


• 所有事件。所有事件名称捕获任何 WebBaseEvent。这个事件类别是对被健康监视系统捕获的每个事件的一个广泛的 catch-all。
 
• 检测信号。检测信号事件使用 WebHeartBeatEvent 提供关于 Web 应用程序状态的定期通知。
 
• 应用程序生存期事件。应用程序生存期事件包括启动和停止应用程序,以及重新编译应用程序的部分或全部。这些事件是基于 WebApplicationLifetimeEvent 的,并且在 lifetime 事件发生时,报告日期、时间和当前的状态。
 
• 所有错误。所有错误类别收集系统检测到的任何异常或错误。这些事件是基于 WebBaseErrorEvent 的。
 
• 基础结构错误。使用 WebErrorEvent 捕获与 ASP.NET 运行库或 IIS 相关的错误。这些事件是所有错误类别的子类,并且主要与系统管理员而不是应用程序开发者相关。
 
• 请求处理错误。在请求期间发生的任何错误或异常都会触发一个 WebRequestErrorEvent。这个事件记录了进入的请求以及与处理该请求相关联的错误。请求处理错误也是所有错误类别的一个子集。
 
• 所有审核。可使用健康监视系统通过 WebAuditEvent 提供审核尝试。这个事件自动记录 Web 应用程序中活动用户的操作。如果您正在使用模拟,审核事件将帮助您对谁在使用您的应用程序,以及他们是如何在使用保持跟踪。
 
• 失败审核。WebFailureAuditEvent 是一个特殊的审核事件类型,当一个用户试图使用无效的用户名或密码登录您的 Web 站点时,它就会被触发。当一个对于指定资源用户是无法验证的时候,此事件也会发生。
 
• 成功审核。WebSuccessAuditEvent 是失败事件的对应,只要用户已验证或执行一些其他需要审核记录的操作就会发生。
 


自定义事件是易于创建的,尽管您必须向您的应用程序添加代码来引发事件。


配置提供程序
每个提供程序都必须在配置文件中注册。注册一个提供程序需要应用程序的唯一名称和类型。这个类型包含了实际 provider 类的完整强名称 (strong name)。提供程序的名称被用作规则区域中的一个链接。


列表 7. 提供程序


<healthMonitoring Enabled=”true” heartBeatInterval=”0″>
 <!– Providers link health events to various targets such as WMI or SMTP email –>
   <providers>
      <add name=”WmiEventProvider” type=”System.Web.Management.WebWmiEventProvider,
          System.Web,Version=1.2.3400.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”/>
  </providers>


ASP.NET 2.0 附带有 WMI、Windows 事件监视器、SMTP 电子邮件和 SQL Server 数据库的提供程序。通过扩展正确的基类,可以创建自定义提供程序来连接到其他事件接收器。


将事件映射到提供程序


配置健康监视的最后一步是,用规则将事件连接到提供程序。规则提供了在好的事件名称、事件类、提供程序和事件配置文件或者类别之间的一个链接。您也可以使用规则来定义启动特定的事件的一个最短时间间隔。


列表 8. 规则


<!– Rules link events to providers and profiles, and define intervals for event checking –>
<rules>
    <add name=”Custom Database Events” eventName=”CustomDBEvents”
         provider=”WmiEventProvider” profile=”Database” minInterval=”00:01:00″ />
    <add name=”Standard Web Requests” eventName=”All Events”
         provider=”SqlEventProvider” profile=”Default” minInterval=”00:01:00″ /> </rules>
</healthMonitoring>
 


规则执行由不同属性配置的若干不同任务:


• name。规则名称是友好名称,它会在事件被发送到接收器时出现。
 
• eventName。eventName 映射到一个在 区域中配置的事件。
 
• provider。提供程序是一个到在 区域中配置的提供程序的链接。任何匹配这个规则的事件将通过这个提供程序传递给由该提供程序支持的目标。举例来说,System.Web.Management.SqlWebEventProvider 会自动将事件写入到 SQL Server 数据库。
 
• profile。不同的提供程序将配置文件属性作为显示事件的过滤器来使用。举例来说,电子邮件提供程序可能立即为任何带有“紧急”配置文件的事件发送一个消息,但是也可能只发送带有该日“例行”配置文件事件的汇编的日常电子邮件。
 
• minInterval。一些事件,如检测信号,必须在最短的时间间隔内激发。您可以使用这个属性来设置最小事件时间间隔。
 


通过这个配置区域,您可以设置各种健康相关事件,并将事件映射到各种提供程序。举例来说,您可能设置一个检测信号,每 10 分钟发送一个 WMI 事件。同样,您可以为任何未捕获的异常设置一个电子邮件警报。