WebApi自定义filter与构造函数中的注入接口不会被调用

我的问题陈述与此问题相同,即在属性/filter中使用注入服务。 我已经尝试过BZ给出的解决方案,以下是我给出的解决方案的代码。

//marker attribute public class AuthorizeViewAttribute : Attribute { } //filter public class AuthorizeViewFilter : IAuthorizationFilter { private readonly IAccessRightsService _iAccessRightService; public AuthorizeViewFilter(IAccessRightsService iAccessRightService) { _iAccessRightService = iAccessRightService; } public void OnAuthorization(AuthorizationContext filterContext) { RoleFeature roleFeature = _iAccessRightService.GetRoleFeatures(); if (roleFeature.IsView) { //redirect to controller } } } 

以下是我使用的ninject绑定:

 this.BindFilter(System.Web.Mvc.FilterScope.Controller, 0) .WhenControllerHas(); 

我不需要属性中的任何参数,所以我想我不需要使用这个答案中提到的WithConstructorArgument

但我的filter永远不会被调用。 我在AuthorizeViewAttribute中放置了一个默认构造函数,调试后发现控件跳转到AuthorizeViewAttribute中的默认构造函数并继续使用控制器方法。

我找不到任何解决方案。 有什么建议?

简短的故事:您似乎试图在webapi控制器上使用MVCfilter和MVC绑定。 这就是为什么它不起作用。

长话:首先创建一个webapifilter提供程序(注意,你需要使用Ninject.Extensions.Factories包来使Nuncject解析Func

 public class AuthorizeViewFilterProvider : System.Web.Http.Filters.IFilterProvider { private readonly Func _authorizeViewFilterFactory; public AuthorizeViewFilterProvider(Func authorizeViewFilterFactory) { this._authorizeViewFilterFactory = authorizeViewFilterFactory; } public IEnumerable GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor) { if(!actionDescriptor.GetCustomAttributes().Any()) return Enumerable.Empty(); return new[] { new FilterInfo(this._authorizeViewFilterFactory(), FilterScope.Action) }; } } 

然后创建一个webapifilter

 public class AuthorizeViewFilter : System.Web.Http.Filters.IAuthorizationFilter { private readonly IAccessRightsService _iAccessRightService; public AuthorizeViewFilter(IAccessRightsService iAccessRightService) { _iAccessRightService = iAccessRightService; } public Task ExecuteAuthorizationFilterAsync( HttpActionContext actionContext, CancellationToken cancellationToken, Func> continuation) { RoleFeature roleFeature = _iAccessRightService.GetRoleFeatures(); if (roleFeature.IsView) { return continuation(); } else return Task.FromResult(actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Access denied")); } } 

然后,在绑定设置中绑定FilterProvider:

 this.Bind().To();