MVC4中的ELMAH和API控制器没有记录错误

Gre*_*nis 12 asp.net-mvc elmah asp.net-mvc-4

在MVC4中使用API​​控制器,当控制器操作抛出异常时,ELMAH不会记录错误.

我认为问题是MVC4将HTTP状态代码设置为500,并且它在JSON对象中返回异常细节,但它不会抛出未处理的异常,因此ELMAH从未看到它.

如何让ELMAH捕获状态代码不是200的所有响应?

jul*_*nox 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());
    }
Run Code Online (Sandbox Code Playgroud)

Global.asax中

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters);
Run Code Online (Sandbox Code Playgroud)

;-)

  • 使用当前的Web API脚手架,过滤器应该在App_Start/WebApiConfig.cs中注册.config.Filters.Add(new ElmahExceptionFilter()); (2认同)

Gre*_*nis 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但您还必须将错误过滤器添加到GlobalConfiguration过滤器:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter());
        filters.Add(new ElmahHandledErrorLoggerFilter());
        filters.Add(new HandleErrorAttribute());
    }
Run Code Online (Sandbox Code Playgroud)