C# 未调用构造函数中具有注入接口的WebApi自定义筛选器
我的问题陈述与在属性/过滤器中使用注入服务相同。我已经尝试了BZ给出的解决方案,下面是我的代码C# 未调用构造函数中具有注入接口的WebApi自定义筛选器,c#,asp.net-web-api,dependency-injection,ninject,C#,Asp.net Web Api,Dependency Injection,Ninject,我的问题陈述与在属性/过滤器中使用注入服务相同。我已经尝试了BZ给出的解决方案,下面是我的代码 //marker attribute public class AuthorizeViewAttribute : Attribute { } //filter public class AuthorizeViewFilter : IAuthorizationFilter { private readonly IAccessRightsService _iAccessRightService;
//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<AuthorizeViewFilter>(System.Web.Mvc.FilterScope.Controller, 0)
.WhenControllerHas<AuthorizeViewAttribute>();
this.BindFilter
但我的过滤器从未被调用。我在AuthorizeViewAttribute中放置了一个默认构造函数,调试后发现该控件跳转到AuthorizeViewAttribute中的默认构造函数,并继续使用controller方法
我找不到任何解决办法。有什么建议吗?短篇故事:您似乎试图在webapi控制器上使用MVC过滤器和MVC绑定。这就是它不起作用的原因
长话短说:首先创建一个webapi过滤器提供程序(注意,您将需要软件包由Ninject解析Func
)
public类AuthorizeViewFilterProvider:System.Web.Http.Filters.IFilterProvider
{
私有只读功能授权视图过滤器工厂;
公共授权ViewFilterProvider(Func authorizeViewFilterFactory)
{
此.\u authorizeViewFilterFactory=authorizeViewFilterFactory;
}
公共IEnumerable GetFilters(HttpConfiguration配置,HttpActionDescriptor actionDescriptor)
{
如果(!actionDescriptor.GetCustomAttributes().Any())
返回可枚举的.Empty();
返回新的[]
{
新建FilterInfo(this.\u authorizeViewFilterFactory(),FilterScope.Action)
};
}
}
然后创建一个webapi过滤器
public class AuthorizeViewFilter : System.Web.Http.Filters.IAuthorizationFilter
{
private readonly IAccessRightsService _iAccessRightService;
public AuthorizeViewFilter(IAccessRightsService iAccessRightService)
{
_iAccessRightService = iAccessRightService;
}
public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(
HttpActionContext actionContext,
CancellationToken cancellationToken,
Func<Task<HttpResponseMessage>> continuation)
{
RoleFeature roleFeature = _iAccessRightService.GetRoleFeatures();
if (roleFeature.IsView)
{
return continuation();
}
else
return Task.FromResult(actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Access denied"));
}
}
public类AuthorizeViewFilter:System.Web.Http.Filters.IAuthorizationFilter
{
专用只读IAccessRights服务_IAccessRights服务;
公共授权视图筛选器(IAccessRightsService iAccessRightService)
{
_iAccessRightService=iAccessRightService;
}
公共任务执行器授权过滤器同步(
HttpActionContext操作上下文,
CancellationToken CancellationToken,
Func(续)
{
RoleFeature RoleFeature=_iAccessRightService.GetRoleFeatures();
if(roleFeature.IsView)
{
返回continuation();
}
其他的
返回Task.FromResult(actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden,“拒绝访问”);
}
}
然后,在绑定设置中绑定FilterProvider:
this.Bind<System.Web.Http.Filters.IFilterProvider>().To<AuthorizeViewFilterProvider>();
this.Bind().To();
请显示使用Web API注册过滤器和/或过滤器提供商的启动代码。谢谢!成功了!一个后续问题:我们如何将属性参数传递给过滤器?作为后续问题,我找到了答案。我们可以使用actionContext.actionDescriptor获取CustomAttribute和相关参数。我还发现了这篇文章,它非常简洁:
this.Bind<System.Web.Http.Filters.IFilterProvider>().To<AuthorizeViewFilterProvider>();