2

我正在努力在 ASP.NET Web API 上使用 ninject、构造函数注入来获取自定义属性/过滤器。

这里有一些片段可以提供一些上下文......

//controller
[ApiAuthorise]
public IEnumerable<Thing> Get()

// Attribute definition with no body
public class ApiAuthoriseAttribute : FilterAttribute {}

// Custom Filter definition
public class ApiAuthoriseFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    { throw new NotImplementedException(); }
}

//Ninject module for my API authorisation 
public class ApiAuthoriseModule : NinjectModule
{
    public override void Load()
    {

        this.BindFilter<ApiAuthoriseFilter>(FilterScope.Action, 0)
            .WhenActionMethodHas<ApiAuthoriseAttribute>()
}}

//The registerServices(IKernel kernel) method in NinjectMVC3.cs
kernel.Load(new ApiAuthoriseModule());

这就是我拥有的关于这个过滤器和属性的所有代码。据我了解,我不必将过滤器显式添加到全局过滤器集合中,因为 ninject 会处理这个问题,对吗?

如果我在我的属性中放置一个构造函数并从那里抛出一个异常,我可以看到该属性正在触发。

我的怀疑是我在 Ninject 方面做错了,但是在花了一个下午阅读其他似乎与我相同的示例后,我知道寻求帮助:)

TIA

4

1 回答 1

5

您需要在 Web API 中使用不同的类,而不是标准System.Web.Mvc.FilterAttribute,并且System.Web.Mvc.IAuthorizationFilter在普通控制器中使用:

public class ApiAuthoriseAttribute : System.Web.Http.Filters.FilterAttribute 
{ 

}

public class ApiAuthoriseFilter : System.Web.Http.Filters.IAuthorizationFilter
{
    public System.Threading.Tasks.Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(System.Web.Http.Controllers.HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken, Func<System.Threading.Tasks.Task<HttpResponseMessage>> continuation)
    {
        throw new NotImplementedException();
    }

    public bool AllowMultiple
    {
        get { return false; }
    }
}

然后您显然必须修改 Ninject 和过滤器绑定语法(BindFilter扩展方法)才能注册这个新类。或者等待Ninject.MVC4哪个将包含此功能。

于 2012-02-29T14:46:00.177 回答