C# 未调用构造函数中具有注入接口的WebApi自定义筛选器

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;

我的问题陈述与在属性/过滤器中使用注入服务相同。我已经尝试了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<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>();