Ninject,WebAPI和ExceptionFilterAttribute被调用两次

时间:2014-02-18 23:14:42

标签: c# asp.net asp.net-web-api ninject

早上好,

在我的项目中,我注意到Ninject的奇怪行为(至少我认为这是问题)。情况如下。我用

Ninject.3.0.2-unstable-9028
Ninject.Extensions.Factory.3.0.1.0
Ninject.Web.Common.3.0.2-unstable-9012
Ninject.Web.WebApi-RC.3.0.0.22

我更改了 NinjectWebCommon.cs 并添加了我的绑定代码。我有一个 WebApiConfig.cs ,用于配置全局异常处理程序

public static void Register(HttpConfiguration config)
{
    // Authentication token handler.
    config.MessageHandlers.Add(new TokenAuthenticationHandler());

    // Exceptions handler.
    config.Filters.Add(new ExceptionsHandler());
    ...
 }

我有一个异常处理程序类

public class ExceptionsHandler : ExceptionFilterAttribute
{
    ...
    public override void OnException(HttpActionExecutedContext context)
    {

        ...
        context.Response = context.Request.CreateErrorResponse(httpStatusCode, response);
    }
}

现在,当请求到达API时,它首先会转到 TokenAuthenticationHandler()对象,它会发挥其魔力并调用

return base.SendAsync(request, cancellationToken);

然后,WebAPI控制器开始行动并发挥其魔力。如果发生异常,它将被抛出并调用ExceptionsHandler的OnException。问题是,当 OnException 完成其工作时,它会再次被调用相同的上下文,我找不到原因。

我没有配置两次。我在web.config中没有额外的记录。当我开始使用 Ninject.Web.WebAPI-RC 库时,它就开始发生了。在此之前,我使用定制的Resolvers和Contexts类,但是,没有处理Ninject创建的对象。所以,我决定用什么有用。一切都有效,除了由于某种原因OnException被调用两次。

如果我删除

config.Filters.Add(new ExceptionsHandler());

来自 WebApiConfig.cs ,然后根本不会调用它。

我认为Ninject与它有关,但我无法理解它为什么会发生。

提前谢谢。

1 个答案:

答案 0 :(得分:8)

试试这个

 [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
 public class ExceptionsHandler : ExceptionFilterAttribute
 {
    ...
    public override void OnException(HttpActionExecutedContext context)
    {

      ...
       context.Response = context.Request.CreateErrorResponse(httpStatusCode, response);
    }
 }

这对我有用.. =)