【问题标题】:How to prevent Elmah logging errors handled in a Error Attribute如何防止在错误属性中处理 Elmah 日志记录错误
【发布时间】:2014-01-03 15:45:06
【问题描述】:

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

根据我要处理的具体情况,我将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 发出信号,不要记录此错误,并希望有任何想法。

【问题讨论】:

  • 祝你好运。从上面的 EDIT 中看,如果处理了异常,Elmah 会从方法中返回?
  • 描述了我所做的,这对我有用,但不是解决很多问题的好方法。

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


【解决方案1】:

请参阅来自 Elmah's documentation 的 ErrorFiltering。简介如下:

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

【讨论】:

  • 但这是关于处理未处理的异常。但是,即使我将异常处理设置为 true elmah 仍然会记录错误。
  • 我遇到了完全相同的问题。我从各个方面搜索了完整的应用程序,但找不到 elmah 记录处理异常的点
【解决方案2】:

我认为解决这个问题的方法很丑陋,但对我遇到的奇怪的错误过滤器极端情况有效。我添加了一个从 Elmah HandleErrorAttribute 复制的自定义 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 构建,因为在多种情况下依赖这感觉有点笨拙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2013-02-13
    • 2015-03-03
    • 2011-03-05
    • 2011-06-03
    • 2014-03-05
    相关资源
    最近更新 更多