如何添加全局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());
值得注意的是,在这两种情况下,您都不需要从适当的FilterAttribute
typesinheritance。 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 { ... }
之后,从CustomizedApiControllerBase
inheritance所有api控制器。与global.ascx文件中的全局filter相比,此方法更具performance力。
- System.ComponentModel.DataAnnotations.compare vs System.Web.Mvc.Compare
- ASP .NET MVC 4 WebApi:手动处理OData查询
- 获取ASP.NET MVC 4中的checkbox值
- 返回Mvc.JsonResult并设置Response.StatusCode
- 将X-Frame-Options标题添加到MVC 4应用程序中的所有页面
- 在ASP.net MVC 4中使用部分视图
- MVCrazorforms与多个不同的提交button?
- 我在哪里可以find一个NuGet包升级到System.Web.Http v5.0.0.0?
- 剃刀2剃刀3 MVC 5