ASP.NET中用healthMonitor属性用法
在asp.net 2.0中,可以使用healthmonitoring属性监测事件。healthmonitoring属性是一个基于方法的provider,在这里可以构造自己的provider。利用healthmonitoring属性,我们可以诸如记录错语、成功的事件等,对不同的数据源,如事件日志,sql server甚至对于自己通过继承webeventprovider类创建自己的providers。在此文章中,我打算介绍配置一个监测sqlserver错语的并且对某人的电子信箱地址发送邮件的web应用程序。首先,看一下在web.config中的healthmonitoring程序片段,在此可以建立将要用到的事件。
<healthmonitoring enabled="true|false" heartbeatinterval="time interval">
<buffermodes>... </buffermodes>
<providers>... </providers>
<eventmappings>... </eventmappings>
<profiles>... </profiles>
<rules>... </rules>
</healthmonitoring>
如果看一下<healthmonitoring>元素,就可以判断是否可以将设置属性为有效或无效,也可以指定对webheaderbeatevent被唤醒的时间间隔。healthmonitoring有5个孩子。
buffermodes,在此可以定义一个provider的缓冲区大小。
providers,在此说明处理事件的providers。
eventmappings, 在此可以画出与友好事件类型相关的事件名称。
profiles, 在此定义一个可以用来配置事件的参数集集合。
rules, 在此画出providers的事件图。
可以阅读更多含在vs 2550文档中的关于这些元素的东西。
在继续之前,这里有一份含asp.net中的一些providers清单:
system.web.management.mailwebeventprovider
system.web.management.simplemailwebeventprovider
system.web.management.templatedmailwebeventprovider
system.web.management.tracewebeventprovider
system.web.management.eventlogwebeventprovider
system.web.management.sqlwebeventprovider
system.web.management.wmiwebeventprovider
不需要解释这些,名字告诉我们它们是干什么的。还要提一下sqlwebeventprovider依靠sql server而工作,它将事件存储在aspnet_web_event表。为了安装此数据库,必须运行位于framework文件夹中的aspnet_regsql.exe向导。
现在,配置对sql server provider有登录错语并且发送一个电子邮件而产生错误的程序。
下面是一个使用sqlwebeventprovider和simplemailwebeventprovider来存错语事件的例子。
<healthmonitoring enabled="true" heartbeatinterval="0">
<buffermodes>
<add name="critical notification" maxbuffersize="100" 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"/>
</buffermodes>
<providers>
<add name="criticalmaileventprovider" type="system.web.management.simplemailwebeventprovider, system.web ..." priority="high" bodyheader="warning!"
bodyfooter="please investigate asap." subjectprefix="action required." buffer="true" buffermode="critical notification" maxeventlength="4096" maxsize="4096" maxmessagespernotification="1"/>
<add name="sqlwebeventprovider" type="system.web.management.sqlwebeventprovider, system.web ..."
connectionstringname="localsqlserver" maxeventdetailslength="1073741823" buffer="true"
buffermode="analysis"/>
</providers>
<eventmappings>
<add name="all errors" type="system.web.management.webbaseerrorevent, system.web ..."/>
<add name="request processing errors" type="system.web.management.webrequesterrorevent, system.web .../>
</eventmappings>
<profiles>
<add name="default" mininstances="1" maxlimit="infinite" mininterval="00:10:00"/>
</profiles>
<rules>
<add name="all errors default" eventname="all errors" provider="sqlwebeventprovider" profile="default"
mininterval="00:00:30"/>
<add name="request processing errors" eventname="request processing errors" provider="criticalmaileventprovider" profile="default"/>
</rules>
</healthmonitoring>
在此例子中,使用sql provider来记录所有错语事件,并且当web请求错误事件被唤醒时使用mail provider来发送一个消息。
这里有一些asp .net 2.0一起发布的事件:
system.web.management.webbaseevent
system.web.management.webheartbeatevent
system.web.management.webapplicationlifetimeevent
system.web.management.webrequestevent
system.web.management.webbaseerrorevent
system.web.management.weberrorevent
system.web.management.webrequesterrorevent
system.web.management.webauditevent
system.web.management.webfailureauditevent
system.web.management.websuccessauditevent
system.web.management.webmanagementevent
system.web.management.webviewstatefailureauditevent
system.web.management.webauthenticationfailureauditevent
system.web.management.webauthenticationsuccessauditevent
可以使用这些事件来对一个provider画图。也可以创建通过webbaseevent类继承来的自己的事件。
为自动唤醒一个事件,可以使用webbaseevent类的唤醒方法:
try
{
//....
}
catch(exception e)
{
if (healthmonitoringmanager.enabled)
{
webbaseevent.raise(new weberrorevent("my error message", null, 5000, e));
}
}
or:
if (healthmonitoringmanager.enabled)
{
weberrorevent event = new weberrorevent("my error message", null, 5000, e);
event.raise();
}