内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我已经创建了一个Web Api过滤器(使用System.Web.Http.Filters.ActionFilterAttribute
),但我无法让它在ASP.Net MVC 4中RegisterGlobalFilters()
工作。我尝试将它添加到该方法,但没有奏效。
因此,如果有人使用ASP.Net MVC托管的Web Api,那么一个注册过滤器如何?
在我的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 API过滤器不是交叉兼容的,如果您想全局注册它们,则必须为每个过滤器使用适当的配置类。
很长的回答: ASP.NET MVC和Web API被有意设计为以类似的方式工作,但它们实际上是不同的生物。
Web API位于System.Web.Http
命名空间下,而MVC位于System.Web.Mvc
命名空间下。这两个人会幸福地并肩生活,但一个不包含另一个,尽管在编程模型中有相似之处,但底层实现是不同的。就像MVC控制器和Web API控制器继承不同的基本控制器类(MVC是简单命名的Controller
并且Web API被命名ApiController
)一样,MVC过滤器和Web API过滤器继承了不同的FilterAttribute
类(在这种情况下,它们共享相同的名称,在他们各自的命名空间中)。
如果在WebActivator中使用项目模板,Web API全局筛选器将通过方法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全局过滤器通过一个GlobalFilterCollection
对象进行注册RegisterGlobalFilters
,对于使用WebActivator的项目,通过FilterConfig.cs的方法可以使用该对象:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //stuff before filters.Add(new MyMvcFilter()); //stuff after } }
或者在GlobalFilters.Filters
没有WebActivator的情况下通过集合的方式在global.asax.cs文件中:
GlobalFilters.Filters.Add(new MyMvcFilter());
值得注意的是,在这两种情况下,都不需要继承适当的FilterAttribute
类型。Web API过滤器只需实现System.Web.Http.IFilter接口,而MVC过滤器注册检查可确保类继承了System.Web.Mvc
名称空间中定义的少数过滤器接口之一。