在MVC4中使用API控制器,当控制器操作抛出异常时,ELMAH不会记录错误。
我认为问题在于MVC4将HTTP状态代码设置为500,并且它在JSON对象中返回异常详细信息,但它不会抛出未处理的异常,因此ELMAH永远不会看到它。
如何让ELMAH捕获状态代码不是200的所有响应?
答案 0 :(得分:22)
之前描述的anwser不起作用。我试过我的测试服务器并收到错误(“给定的过滤器实例必须实现以下一个或多个过滤器接口:IAuthorizationFilter,IActionFilter,IResultFilter,IExceptionFilter。”)
然后我意识到发生了什么......你正在尝试将自定义过滤器添加到MVC全局过滤器(filters.Add(new ElmahHandledErrorLoggerFilter());)
为了解决这个问题,我在GlobalFilter和HttpFilter中拆分了过滤器注册
FilterConfig.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterHttpFilters(HttpFilterCollection filters)
{
filters.Add(new ElmahHandledErrorLoggerFilter());
}
Global.asax中
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters);
- )
答案 1 :(得分:16)
更新:此答案在最新版本中不起作用。使用julianox的答案。
通过此处的信息找到答案:http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling
异常过滤器记录到elmah:
public class ElmahHandledErrorLoggerFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
base.OnException(actionExecutedContext);
ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception);
}
}
但您还必须将错误过滤器添加到GlobalConfiguration过滤器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter());
filters.Add(new ElmahHandledErrorLoggerFilter());
filters.Add(new HandleErrorAttribute());
}