在 ASP.NET MVC 3 项目中,您将在HandleError
默认情况下注册一个全局操作过滤器global.asax.cs
:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
此属性应用于每个控制器操作,如果customErrors
设置为On
仅显示自定义错误页面,并且控制器操作中发生的异常被标记为已处理。ASP.NET 运行状况监视不再看到此异常并且无法记录它。
此处、此处和此处描述了将 Health Monitoring 与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();
}
}
然后注册这个属性而不是 default HandleError
:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorHealthMonitoringAttribute());
}
GenericWebRequestErrorEvent
是从 base 派生的自定义错误事件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
)。