2

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

--update 这是 MVC3 项目

4

1 回答 1

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 与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)。

于 2012-10-23T21:44:02.140 回答