我正在使用Health Monitoring来捕获所有错误并将其发送到电子邮件。虽然它在开发环境中工作,但当我在Prod中部署它时却没有。唯一的区别是“customerrors”设置为“on / off”。所以,我再次验证了它,并且当自定义错误设置为“On / RemoteOnly”时似乎不会记录。以下是我的配置的一部分。
这个问题有解决方法吗?谢谢。
<healthMonitoring enabled="true">
<eventMappings>
<clear />
<add name="All Errors" type="System.Web.Management.WebBaseErrorEvent"
startEventCode="0" endEventCode="2147483647" />
</eventMappings>
<providers>
<clear />
<add
name="SimpleMailWebEventProvider"
type="System.Web.Management.SimpleMailWebEventProvider"
to="dev@net"
from="de@net"
buffer="false"
/>
</providers>
<rules>
<clear />
<add name="All Errors Default" eventName="All Errors" provider="SimpleMailWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>
</healthMonitoring>
- 更新 这是MVC3项目
答案 0 :(得分:4)
在ASP.NET MVC 3项目中,默认情况下会在HandleError
中注册一个全局global.asax.cs
操作过滤器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
此属性应用于每个控制器操作,如果customErrors
设置为On
,则仅显示自定义错误页面,并且控制器操作中发生的异常为标记为已处理。 ASP.NET Health Monitoring不再看到此异常,也无法记录它。
here和here以及here描述了将健康监控与HandleError
属性和自定义错误页面结合使用的方法:
您创建了从HandleError
派生的自定义错误属性:
public class HandleErrorHealthMonitoringAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
// Do the default, i.e. show custom error page if custom errors are on
base.OnException(filterContext);
// Suppress raising the health monitoring event below if custom errors
// are off. In that case health monitoring will receive the exception
// anyway and raise the event
if (!filterContext.HttpContext.IsCustomErrorEnabled)
return;
// Raise health monitoring event
var errorEvent = new GenericWebRequestErrorEvent(
"Unhandled exception occurred.", this,
WebEventCodes.WebExtendedBase + 1, filterContext.Exception);
errorEvent.Raise();
}
}
然后注册此属性而不是默认HandleError
:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorHealthMonitoringAttribute());
}
GenericWebRequestErrorEvent
是从基础WebRequestErrorEvent
派生的自定义错误事件。它不执行任何自定义操作,仅存在,因为WebRequestErrorEvent
没有任何public
构造函数,因此我们无法使用var errorEvent = new WebRequestErrorEvent(...)
:
public class GenericWebRequestErrorEvent : WebRequestErrorEvent
{
public GenericWebRequestErrorEvent(string message, object eventSource,
int eventCode, Exception exception) :
base(message, eventSource, eventCode, exception)
{
}
public GenericWebRequestErrorEvent(string message, object eventSource,
int eventCode, int eventDetailCode, Exception exception) :
base(message, eventSource, eventCode, eventDetailCode, exception)
{
}
}
请注意,您会收到一封标有MyNamespace.GenericWebRequestErrorEvent
而不是System.Web.Management.WebRequestErrorEvent
的电子邮件,但事件代码始终为100001
(= WebEventCodes.WebExtendedBase + 1
)。