如何防止在错误属性中处理Elmah日志记录错误

时间:2014-01-03 15:45:06

标签: asp.net asp.net-mvc-4 elmah

我在asp.net,mvc4网络应用程序中使用Elmah和Elmah.mvc软件包。我有一个特定的控制器操作,我想以特定的方式处理HttpAntiForgeryExceptions。我创建了一个自定义的HandleErrorAttribute,它继承自HandleErrorAttribute并实现IExceptionFilter

在我想要处理的特定情况下,我将ExceptionContext.ExceptionHandled设置为true。用户看到的行为是正确的,错误按我希望的那样处理。但是,它也会向Elmah记录一个错误,我不想这样做,因为我想保留Elmah日志以查找真正的错误。

控制器注释如下所示:

[ValidateAntiForgeryToken]
[CustomHandleAntiforgeryError]
public ActionResult ControllerMethod(Model model) 
{ 
    ... 
}

CustomHandleAntiforgeryError如下所示:

public class CustomHandleAntiforgeryErrorAttribute: 
                              HandleErrorAttribute, IExceptionFilter 
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (circumstancesAreOk) 
        {
            filterContext.ExceptionHandled = true;
            return;
        }
    }
}

我还需要做些什么来防止用Elmah记录这个错误吗?

---编辑---

查看Elmah.MVC源HandleErrorAttribute记录已处理和未处理的错误

public override void OnException(ExceptionContext context)
    {
        base.OnException(context);

        if (!context.ExceptionHandled) // if unhandled, will be logged anyhow
            return;

        var e = context.Exception;
        var httpContext = context.HttpContext.ApplicationInstance.Context;
        if (httpContext != null && 
            (RaiseErrorSignal(e, httpContext) // prefer signaling, if possible
             || IsFiltered(e, httpContext))) // filtered?
            return;

        LogException(e, httpContext);
    }

我希望在我的自定义属性中有一种方式向Elmah发出信号,不要记录此错误,并且会感谢任何想法。

2 个答案:

答案 0 :(得分:0)

请参阅Elmah's documentation中的ErrorFiltering。这是介绍:

  

当ASP.NET向ELMAH报告未处理的异常时,   应用程序可以决定是否解除该异常。那里   有两种方法可以让应用程序以编程方式执行此操作   以声明方式通过配置文件。两者中较简单的是   以编程方式,因为你不需要学习任何新的东西,除了   用你最喜欢的语言写一个事件处理程序。的缺点   程序化方法是你需要编写代码并修改你的代码   Web应用程序(可能需要静态重新编译)。随着   基于配置的方法,您可以简单地应用过滤   正在运行的应用程序的例外。

答案 1 :(得分:0)

我所做的解决这个问题我觉得很难看,但是我正在经历一个奇怪的错误过滤器角落案例。我添加了一个自定义HandleErrorAttribute,从Elmah HandleErrorAttribute复制并在OnException方法中包含一个空检查。

    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);

        if (!context.ExceptionHandled) // if unhandled, will be logged anyhow
            return;

        string[] formKeys = context.HttpContext.Request.Form.AllKeys;

        var e = context.Exception;

        // linked to CustomErrorAttribute
        if (e == null)
        {
            return;
        }

        bool test = HostingEnvironment.IsHosted;

        var httpContext = context.HttpContext.ApplicationInstance.Context;
        if (httpContext != null &&
            (RaiseErrorSignal(e, httpContext) // prefer signaling, if possible
             || IsFiltered(e, httpContext))) // filtered?
            return;

        LogException(e, httpContext);
    }

然后,在我的错误过滤器中,我不想触发向Elmah发送消息,以及将ExceptionContext ExceptionHandled设置为true我将Exception设置为null

public class MyCustomErrorFilter : IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
         if (blah, blah, blah, weird things but not something terrible) 
         {
            filterContext.Exception = null;
            filterContext.ExceptionHandled = true;
            return;
         }
     }
 }

如果它涉及更多并且经常发生,我可能会分叉Elmah,并考虑创建一个自定义的Elmah构建,因为在多种情况下依赖它会感觉有点hacky。