如何为ASP.Net Healthmonitoring编写和配置自定义提供程序?

时间:2011-01-04 18:23:26

标签: c# asp.net health-monitoring

我正在寻找有关如何为ASP.Net Healthmonitoring创建和使用自定义提供程序的演练。

到目前为止,我只与提供错误电子邮件的电子邮件提供商合作。基本上我想做同样的事,但具有更大的灵活性:
我想使用HealthMonitoring功能(我不想在global.asax中使用Application_OnError事件),这种方式允许我访问一个事件,该事件像“OnNewHealthMonitoringEntry”一样被抛出,其中提供了所有信息。电子邮件,以运行自定义代码。

修改
基于此处提供的源代码http://www.asp.net/general/videos/how-do-i-create-a-custom-provider-for-logging-health-monitoring-events,我能够构建自己的自定义提供程序并实现它。现在我想添加一些新属性来配置我的自定义提供程序。 这是web.config的样子:

<healthMonitoring>
    <bufferModes>
        <add name="Log Notification" maxBufferSize="1" maxFlushSize="1" urgentFlushThreshold="1" regularFlushInterval="Infinite" urgentFlushInterval="00:00:10"/>
    </bufferModes>
    <providers>
        <add name="FileEventProvider" buffer="true" bufferMode="Log Notification" type="healthmonitoringtest.FileHealthMonitorEventProvider"/>
    </providers>
    <profiles>
        <add name="Custom" minInstances="1" maxLimit="Infinite" minInterval="00:00:00"/>
    </profiles>
    <rules>
        <add name="File Event Provider" eventName="All Errors" provider="FileEventProvider" profile="Custom"/>
    </rules>
</healthMonitoring>

如果我尝试向提供者添加属性,例如

<providers>
    <add name="FileEventProvider" buffer="true" bufferMode="Log Notification" foo="bar"  type="healthmonitoringtest.FileHealthMonitorEventProvider"/>
</providers>

我会收到一个错误说:

  

类型的例外   'System.Configuration.ConfigurationErrorsException'   发生在System.Web.dll但不是   用户代码处理附加   信息:意外的属性foo   在配置中   FileEventProvider。

是否可以将自定义提供程序所需的配置存储在healthMonitoring部分附近?我想我可以将设置包含到appSettings节点中,但我想以某种方式使用属性(在healthMonitoring节点内)配置它。这可能吗?

EDIT2 : 您可以查看一下这篇文章:http://www.tomot.de/en-us/article/6/asp.net/how-to-create-a-custom-healthmonitoring-provider-that-sends-e-mails

1 个答案:

答案 0 :(得分:2)

以下series of articles将向您介绍使用运行状况监控系统创建自定义事件的基础知识。

然后,以下26 minute video将指导您创建一个自定义提供程序,将事件记录到基于文本的日志文件中。

根据评论更新

查看您的更新并使用Reflector查看您自定义提供程序所基于的BufferedWebEventProvider类的源代码,我发现BufferedWebEventProvider中的Initialize方法最后会进行检查查看是否存在任何无法识别的属性。这是通过在将配置NameValueCollection参数分配给BufferedWebEventProvider的属性或字段后立即删除它们来完成的。然后进行检查以查看config参数是否为空,如果不是,则表示添加了额外的属性,这会导致抛出异常。

至于如何解决这个问题,一个选项是:

  1. 将调用移至base.Initialize到方法的结尾
  2. 一旦将其分配给变量,就像提供者那样删除其他属性。
  3. 以下内容可行:

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
        {
            foo = config["foo"];
            if (String.IsNullOrEmpty(foo))
            {
                // You can set a default value for foo
            }
    
            //remove foo from the config just like BufferedWebEventProvider with the other
            //attributes. Note that it doesn't matter if someone didn't proivde a foo attribute
            //because the NameValueCollection remains unchanged if you call its Remove method
            //and the name doesn't exist.
            config.Remove("foo");
    
            base.Initialize(name, config);
        }
    

    希望这对你有用。