当CustomError设置为“On”或“RemoteOnly”时,运行状况监视不会记录错误

时间:2012-08-27 20:12:40

标签: asp.net asp.net-mvc asp.net-mvc-3 health-monitoring

我正在使用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项目

1 个答案:

答案 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不再看到此异常,也无法记录它。

herehere以及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)。