我正在寻找有关如何为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
答案 0 :(得分:2)
以下series of articles将向您介绍使用运行状况监控系统创建自定义事件的基础知识。
然后,以下26 minute video将指导您创建一个自定义提供程序,将事件记录到基于文本的日志文件中。
根据评论更新
查看您的更新并使用Reflector查看您自定义提供程序所基于的BufferedWebEventProvider
类的源代码,我发现BufferedWebEventProvider
中的Initialize方法最后会进行检查查看是否存在任何无法识别的属性。这是通过在将配置NameValueCollection参数分配给BufferedWebEventProvider
的属性或字段后立即删除它们来完成的。然后进行检查以查看config参数是否为空,如果不是,则表示添加了额外的属性,这会导致抛出异常。
至于如何解决这个问题,一个选项是:
以下内容可行:
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);
}
希望这对你有用。