早上好,
在我的项目中,我注意到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与它有关,但我无法理解它为什么会发生。
提前谢谢。
答案 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);
}
}
这对我有用.. =)