zoukankan      html  css  js  c++  java
  • ASP.NET中的healthMonitoring

    有不少朋友不了解这个所谓的healthMonitoring,实际上这是自.NET Framework 2.0就开始拥有的特性。顾名思义,它是可以帮助我们对ASP.NET应用程序运行的健康状况进行监视的一套服务。

    这个部分的设置,可以在F:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG目录下面的web.config文件中找到。

    我要简要地介绍一下这个特性的架构

    1. 首先,要设置有关的eventMappings,也就是说定义要监视的事件。

    2. 然后,定义所谓的监视提供程序(provider),此时可能要定义有关的bufferMode,也就是每个provider所使用的缓冲模型。

    3. 然后,定义有关的规则,也就是说,哪些事件采用哪种provider来监视。(默认会有两个规则,就是将错误的事件,以及审核失败的事件,发送到事件日志中去)

    下面的粗体部分是我添加的,意思是说将所有事件都发送到一个数据库中去。

           <healthMonitoring>
                <bufferModes>
                    <add name="Critical Notification" maxBufferSize="100" maxFlushSize="20" urgentFlushThreshold="1" regularFlushInterval="Infinite" urgentFlushInterval="00:01:00" maxBufferThreads="1"/>
                    <add name="Notification" maxBufferSize="300" maxFlushSize="20" urgentFlushThreshold="1" regularFlushInterval="Infinite" urgentFlushInterval="00:01:00" maxBufferThreads="1"/>
                    <add name="Analysis" maxBufferSize="1000" maxFlushSize="100" urgentFlushThreshold="100" regularFlushInterval="00:05:00" urgentFlushInterval="00:01:00" maxBufferThreads="1"/>
                    <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=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
                    <add connectionStringName="LocalSqlServer" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Notification" name="SqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
                    <add name="WmiWebEventProvider" type="System.Web.Management.WmiWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
                </providers>
    
                <profiles>
                    <add name="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
                    <add name="Critical" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" custom=""/>
                </profiles>
    
                <rules>
                    <add name="All Errors Default" eventName="All Errors" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
                    <add name="Failure Audits Default" eventName="Failure Audits" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
            <add name="All Events" eventName="All Events" provider="SqlWebEventProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
                </rules>
    
                <eventMappings>
                    <add name="All Events" type="System.Web.Management.WebBaseEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                    <add name="Heartbeats" type="System.Web.Management.WebHeartbeatEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                    <add name="Application Lifetime Events" type="System.Web.Management.WebApplicationLifetimeEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                    <add name="Request Processing Events" type="System.Web.Management.WebRequestEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                    <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                    <add name="Infrastructure Errors" type="System.Web.Management.WebErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                    <add name="Request Processing Errors" type="System.Web.Management.WebRequestErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                    <add name="All Audits" type="System.Web.Management.WebAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                    <add name="Failure Audits" type="System.Web.Management.WebFailureAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                    <add name="Success Audits" type="System.Web.Management.WebSuccessAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
                </eventMappings>
    
            </healthMonitoring>

    这个数据库其实是与membership等服务公用的,如下图所示

    image

    看到这里,有的朋友可能要问,那么这些事件能不能添加呢?答案是肯定的,下面有一个简单的例子。

       1:  using System;
       2:  using System.Web;
       3:  using System.Web.Management;
       4:  using System.Web.UI;
       5:  using System.Web.UI.WebControls;
       6:   
       7:   
       8:  namespace Samples.AspNet.Management
       9:  {
      10:   
      11:      public class CustomWebEvents : Page, IHttpModule
      12:      {
      13:   
      14:          public override void Dispose()
      15:          {
      16:          }
      17:   
      18:          // Add event handlers to the HttpApplication.
      19:          public new void Init(HttpApplication httpApp)
      20:          {
      21:              httpApp.BeginRequest +=
      22:                  new EventHandler(OnBeginRequest);
      23:   
      24:              httpApp.EndRequest +=
      25:                  new EventHandler(OnEndRequest);
      26:   
      27:          }
      28:   
      29:          // Issues a custom begin request event.
      30:          public void OnBeginRequest(Object sender, EventArgs e)
      31:          {
      32:   
      33:              HttpApplication httpApp = sender as HttpApplication;
      34:   
      35:              try
      36:              {
      37:                  // Make sure to be outside the forbidden range.
      38:                  System.Int32 myCode = WebEventCodes.WebExtendedBase + 30;
      39:                  SampleWebRequestEvent swre =
      40:                    new SampleWebRequestEvent(
      41:                    "SampleWebRequestEvent Start", this, myCode);
      42:                  // Raise the event.
      43:                  swre.Raise();
      44:              }
      45:              catch (Exception ex)
      46:              {
      47:                  httpApp.Context.Response.Output.WriteLine(
      48:                      ex.ToString());
      49:              }
      50:   
      51:          }
      52:   
      53:          // Issues a custom end request event.
      54:          public void OnEndRequest(Object sender, EventArgs e)
      55:          {
      56:              HttpApplication httpApp = sender as HttpApplication;
      57:   
      58:              try
      59:              {
      60:                  // Make sure to be outside the forbidden range.
      61:                  System.Int32 myCode = WebEventCodes.WebExtendedBase + 40;
      62:                  SampleWebRequestEvent swre =
      63:                    new SampleWebRequestEvent(
      64:                    "SampleWebRequestEvent End", this, myCode);
      65:                  // Raise the event.
      66:                  swre.Raise();
      67:              }
      68:              catch (Exception ex)
      69:              {
      70:                  httpApp.Context.Response.Output.WriteLine(
      71:                      ex.ToString());
      72:              }
      73:   
      74:          }
      75:      }
      76:      public class SampleWebRequestEvent : System.Web.Management.WebRequestEvent
      77:      {
      78:          private string customCreatedMsg;
      79:          private string customRaisedMsg;
      80:   
      81:          // Invoked in case of events identified only by their event code.
      82:          public SampleWebRequestEvent(
      83:              string msg,
      84:              object eventSource,
      85:              int eventCode)
      86:              :
      87:              base(msg, eventSource, eventCode)
      88:          {
      89:              // Perform custom initialization.
      90:              customCreatedMsg = string.Format("Event created at: {0}",
      91:                  EventTime.ToString());
      92:          }
      93:   
      94:          // Invoked in case of events identified by their event code and 
      95:          // related event detailed code.
      96:          public SampleWebRequestEvent(
      97:              string msg,
      98:              object eventSource,
      99:              int eventCode,
     100:              int eventDetailCode)
     101:              :
     102:              base(msg, eventSource, eventCode, eventDetailCode)
     103:          {
     104:              // Perform custom initialization.
     105:              customCreatedMsg = string.Format("Event created at: {0}",
     106:                  EventTime.ToString());
     107:   
     108:          }
     109:   
     110:          // Raises the SampleWebRequestEvent.
     111:          public override void Raise()
     112:          {
     113:              // Perform custom processing.
     114:              customRaisedMsg = string.Format("Event raised at: {0}",
     115:                  EventTime.ToString());
     116:   
     117:              // Raise the event.
     118:              base.Raise();
     119:          }
     120:   
     121:          //Formats Web request event information.
     122:          public override void FormatCustomEventDetails(
     123:              WebEventFormatter formatter)
     124:          {
     125:              // Add custom data.
     126:              formatter.AppendLine("");
     127:   
     128:              formatter.IndentationLevel += 1;
     129:              formatter.AppendLine("* Custom Request Information Start *");
     130:   
     131:              // Display custom event timing.
     132:              formatter.AppendLine(customCreatedMsg);
     133:              formatter.AppendLine(customRaisedMsg);
     134:   
     135:              formatter.AppendLine("* Custom Request Information End *");
     136:   
     137:              formatter.IndentationLevel -= 1;
     138:          }
     139:      }
     140:  }
     
    从上面的代码可以看出,要实现一个自定义的事件,只要继承System.Web.Management命名空间下面的某个Event类型即可。
    然后在web.config中进行注册
    <httpModules>
      <add name="Raising Custom Web Events" 
        type="Samples.AspNet.Management.CustomWebEvents" 
      />
    </httpModules>
    <healthMonitoring 
      heartbeatInterval="0" 
      enabled="true">
      <eventMappings>
        <add name="SampleWebRequestEvent" 
          type="Samples.AspNet.Management.SampleWebRequestEvent" 
        />
      </eventMappings>
      <profiles>
        <add name="Custom" 
          minInstances="1" 
          maxLimit="Infinite" 
          minInterval="00:00:00" 
        />
      </profiles>
      <rules>
        <clear />
          <add name="Custom Web Request Event" 
            eventName="SampleWebRequestEvent"
            provider="EventLogProvider" 
            profile="Custom" 
         />
      </rules>
    </healthMonitoring>
     
    而要引发该事件,则大致使用下面的代码即可
       1:                  // Make sure to be outside the forbidden range.
       2:                  System.Int32 myCode = WebEventCodes.WebExtendedBase + 30;
       3:                  SampleWebRequestEvent swre =
       4:                    new SampleWebRequestEvent(
       5:                    "SampleWebRequestEvent Start", this, myCode);
       6:                  // Raise the event.
       7:                  swre.Raise();
     
  • 相关阅读:
    数据绑定表达式语法(Eval,Bind区别)
    使用博客园的第一件事 自定义主题
    sql2000 跨服务器复制表数据
    使用UpdatePanel 局部刷新出现中文乱码的解决方法!!
    MMC不能打开文件MSC文件
    sql 日期 、时间相关
    loaded AS2 swf call function in AS3 holder
    Rewrite the master page form action attribute in asp.net 2.0
    100万个不重复的8位的随机数
    flash 中实现斜切变型
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1675256.html
Copyright © 2011-2022 走看看