将Elmah与WebApi一起使用时,会记录两次错误

时间:2013-03-12 09:28:52

标签: asp.net-mvc asp.net-web-api elmah

我正在尝试使用elmah从我的asp.net web api项目中记录异常。我遇到的问题是每次错误记录两次。

我使用的是Elmah.Contrib.Web-Api,我的Application类如下:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configuration.Filters.Add(new ElmahHandleErrorApiAttribute());

        RouteTable.Routes.MapHubs();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

#if DEBUG
        EntityFrameworkProfiler.Initialize();
#endif

        GlobalConfig.CustomizeConfig(GlobalConfiguration.Configuration);

    }
}

如果我提出以下行,那么我根本就没有消息:

GlobalConfiguration.Configuration.Filters.Add(new ElmahHandleErrorApiAttribute());

我可以确认我只抛出一个错误,产生错误的调用只被调用一次而且我没有用Elmah属性手动修饰我的控制器或方法。

要尝试解决此问题,我删除了Contrib包,并按照此处http://www.tugberkugurlu.com/archive/asp-net-web-api-and-elmah-integration

中的说明添加了

这没有解决问题,它仍然会记录两次。它确实允许我在Attribute类中加入一个断点,并确认每次错误都会被调用两次。

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:4)

您的web.config中有哪些与ELMAH相关的条目?

我在MVC应用程序中遇到了类似的问题 - 处理的异常被记录了两次。在应用程序中,我使用自定义异常过滤器使用错误信号将处理的异常记录到ELMAH,而HTTP模块负责处理未处理的异常。

原来我需要设置:

<add key="elmah.mvc.disableHandleErrorFilter" value="true" />
在web.config中

以禁用ELMAH.MVC NuGet包中的内置异常过滤器。

内置过滤器的源代码显示它记录处理的异常: https://github.com/alexanderbeletsky/elmah-mvc/blob/master/src/Elmah.Mvc/HandleErrorAttribute.cs

答案 1 :(得分:3)

我会检查你的FilterConfig.cs类,可能是在那里添加了默认的HandleErrorAttribute并重新抛出你的异常?

答案 2 :(得分:3)

对于它的价值,我遇到了同样的错误:ELMAH在我的Web API应用程序中两次记录每个异常(使用Elmah.Contrib.WebApi)。

将我的ELMAH电子邮件与我的源历史进行比较,我能够确定在通过nuget安装Ninject.Web.WebApi 3.0.2-unstable-9016软件包之后问题开始发生。

果然,卸载软件包并注释掉使用它的单个依赖项绑定解决了双重异常日志记录问题。重新安装包并将依赖项绑定注释掉,导致问题再次出现,因此它不是绑定本身。

安装以前的版本(Ninject.Web.WebApi 3.0.2-unstable-8)并没有导致问题发生,但我的依赖绑定不再有效。

我选择暂时解决这个问题。

答案 3 :(得分:0)

你见过this post吗?作者使用ExceptionFilter来处理日志记录异常

答案 4 :(得分:0)

对于记录两次问题的其他人(我不认为这有助于OP?) - 这发生在我身上,原因是因为我全局应用了过滤器

GlobalConfiguration.Configuration.Filters.Add(new ElmahErrorAttribute()); //log web api errors

但也将该属性应用于类(doh!)

[ElmahError]
public class TestController : ApiController

当然,它记录了两次。

答案 5 :(得分:0)

我只在HTTP 401响应中出现此问题。问题原来是启用了Windows身份验证,导致浏览器发出第二个协商请求。

就我而言,我只能在web.config中禁用Windows身份验证:

<security>
  <authentication>
    <windowsAuthentication enabled="false" />
  </authentication>
</security>

注意:如果您没有解锁配置部分,则可以在IIS中禁用Windows身份验证。