我在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发出信号,不要记录此错误,并且会感谢任何想法。
答案 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。