12

在 MVC4 中使用 API 控制器,当控制器操作引发异常时,ELMAH 不会记录错误。

我认为问题在于 MVC4 将 HTTP 状态代码设置为 500,并在 JSON 对象中返回异常详细信息,但它不会引发未处理的异常,因此 ELMAH 永远不会看到它。

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

4

2 回答 2

22

前面描述的 anwser 不起作用。我在我的测试服务器上尝试过并收到一个错误(“给定的过滤器实例必须实现以下一个或多个过滤器接口:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。”)

然后我意识到发生了什么....您正在尝试将自定义过滤器添加到 MVC 全局过滤器 (filters.Add(new ElmahHandledErrorLoggerFilter());)

为了解决这个问题,我在 GlobalFilter 和 HttpFilter 中拆分了过滤器注册

过滤器配置文件

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterHttpFilters(HttpFilterCollection filters)
    {
        filters.Add(new ElmahHandledErrorLoggerFilter());
    }

全球.asax

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters);

;-)

于 2012-11-07T06:50:38.037 回答
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());
    }
于 2012-04-09T01:04:50.390 回答