请注意,这个答案适用于 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 一起使用,则通过 Register 方法 WebApiConfig.cs 中可用的 HttpConfiguration 对象注册 Web API 全局过滤器:
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 对象注册,对于使用 WebActivator 的项目,您可以通过 FilterConfig.cs 的 RegisterGlobalFilters 方法使用该对象:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
或在 global.asax.cs 文件中通过GlobalFilters.Filters 集合的方式为那些没有 WebActivator 的人提供:
GlobalFilters.Filters.Add(new MyMvcFilter());
值得注意的是,在这两种情况下,您都不需要从适当的FilterAttribute 类型继承。 Web API 过滤器只需要实现 System.Web.Http.IFilter 接口,而 MVC 过滤器注册检查以确保您的类继承了在 System.Web.Mvc 命名空间中定义的少数过滤器接口之一。