【问题标题】:ELMAH and API controller in MVC4 not logging errorsMVC4 中的 ELMAH 和 API 控制器不记录错误
【发布时间】:2012-04-08 00:47:34
【问题描述】:

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

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

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

【问题讨论】:

  • 可能值得注意的是,API 控制器在 Web API 中,而不是在 MVC 中。每个单独的执行路径通常是导致以 MVC 为目标的库与 Web API 不兼容的原因。每个请求要么通过 MVC,要么通过 Web API。两者并排且不交互(Web API 不是 MVC 执行中的功能)。它们有不同的上下文、不同的路由表、不同的配置,都不同,都是独立的。

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


【解决方案1】:

前面描述的 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());
    }

全球.asax

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

;-)

【讨论】:

  • 使用当前的 Web API 脚手架,过滤器应该在 App_Start/WebApiConfig.cs 中注册。 config.Filters.Add(new ElmahExceptionFilter());
  • 我刚刚通过 nuget Elmah.MVC 安装。超级容易上手,但是,不记录 500 错误。我理解上面的答案,但是,在我的 Elmah.* 或 Elmah.Mvc.* 空格中看不到 ElmahHandledErrorLoggerFilter (显示在上面的代码 sn-p 中)编辑:哎呀,我现在看到了......自己写..它显示在OP的代码sn-p中。对不起! ;)
  • 嗨。这有效,错误被记录到 elmah,但没有为所有 api 500 发送邮件。有什么办法可以解决这个问题?
【解决方案2】:

更新:此答案在最新版本中不起作用。使用 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());
    }

【讨论】:

  • 好东西。我为此苦苦挣扎,并没有将 Elmah 过滤器添加到 GlobalConfiguration。
  • 当我这样做时,它根本不起作用,除非我添加 GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter());在 RegisterGlobalFilters 方法中。 filters.Add(new ElmahHandledErrorLoggerFilter()); 不应该吗?行有做到吗?两者兼得有什么意义?
  • @JustinP8 WebApi 几乎完全重新创建了一些已经在 MVC 中的东西。虽然这令人沮丧,但您可以看到 WebApi 和 MVC 是不同的角色——一个面向 UI,另一个面向软件。如果您查看 GlobalConfiguration.Configuration.Filters (HttpFilterCollection) 和 GlobalFilters.Filters (GlobalFilterCollection) 返回的类型,您会发现它们是不同的野兽。
  • 这对我不起作用。我收到了这个错误The given filter instance must implement one or more of the following filter interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter. 上面的另一个答案 (stackoverflow.com/a/13264550/1182982) 对我有用。
猜你喜欢
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2011-03-01
  • 2012-03-04
  • 2019-09-21
相关资源
最近更新 更多