如何添加全局ASP.Net Web Apifilter?

我已经创build了一个Web Apifilter(使用System.Web.Http.Filters.ActionFilterAttribute ),但我无法得到它在ASP.Net MVC 4内工作。我试图将其添加到RegisterGlobalFilters()方法,但didn没有工作。

所以,如果一个人使用ASP.Net MVC托pipe的Web Api如何注册filter?

以下代码在我的Global.asax中适用于我:

 public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters) { filters.Add(new MyWebApiFilter()); } protected void Application_Start() { RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters); } 

注意,这个答案适用于MVC 5 / Web API 2

简而言之: MVC和Web APIfilter不是交叉兼容的,如果你想全局注册它们,你必须使用适当的configuration类。

长的回答: ASP.NET MVC和Web API被有意devise成以类似的方式工作,但实际上它们是不同的生物。

Web API位于System.Web.Http命名空间下,而MVC位于System.Web.Mvc命名空间下。 两个人将幸福地并肩而生,但是一个不包含另一个,尽pipe在编程模型中有相似之处,但底层的实现是不同的。 就像MVC控制器和Web API控制器inheritance不同的基本控制器类(MVC简称为Controller ,Web API被命名为ApiController )一样,MVCfilter和Web APIfilterinheritance自不同的FilterAttribute类(在这种情况下共享相同的名称,但是是分开的生活在各自的命名空间中的类)。

如果您在WebActivator中使用项目模板,Web API全局filter将通过Register方法WebApiConfig.cs中可用的HttpConfiguration对象进行Register

 public static void Register(HttpConfiguration config) { //stuff before config.Filters.Add(new MyWebApiFilter()); //stuff after } 

或以其他方式在global.asax.cs中:

 GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter()); 

Mvc全局filter通过GlobalFilterCollection对象进行RegisterGlobalFilters ,对于正在使用WebActivator的项目,通过FilterConfig.cs的RegisterGlobalFilters方法可以使用此对象:

 public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //stuff before filters.Add(new MyMvcFilter()); //stuff after } } 

或者通过GlobalFilters.Filters集合的方式在global.asax.cs文件中find那些没有WebActivator的文件:

 GlobalFilters.Filters.Add(new MyMvcFilter()); 

值得注意的是,在这两种情况下,您都不需要从适当的FilterAttributetypesinheritance。 Web APIfilter只需要实现System.Web.Http.IFilter接口,而MVCfilter注册检查将确保您的类inheritance了System.Web.Mvc命名空间中定义的less数filter接口之一。

从MVC 4 RC开始,正确的类名是HttpFilterCollection

 public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters) { filters.Add(new MyWebApiFilter()); } protected void Application_Start() { RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters); } 

我宁愿这样做,而不是使用全局filter:

 [MyWebApiFilter] public class CustomizedApiControllerBase : ApiController { ... } 

之后,从CustomizedApiControllerBaseinheritance所有api控制器。与global.ascx文件中的全局filter相比,此方法更具performance力。