我已经创建了一个 Web Api 过滤器(使用System.Web.Http.Filters.ActionFilterAttribute
),但我无法让它在 ASP.Net MVC 4 中工作。我尝试将它添加到RegisterGlobalFilters()
方法中,但没有奏效。
因此,如果使用托管在 ASP.Net MVC 中的 Web Api,如何注册过滤器?
我已经创建了一个 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 一起使用,则通过 WebApiConfig.cs 方法HttpConfiguration
中可用的对象注册 Web API 全局过滤器: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 全局过滤器通过对象的方式注册,对于使用 WebActivator 的项目,GlobalFilterCollection
您可以通过 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
命名空间中定义的少数过滤器接口之一。
从 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);
}
而不是使用全局过滤器,我更喜欢这样做:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
之后继承所有的 api 控制器,CustomizedApiControllerBase
与 global.ascx 文件中的全局过滤器相比,这种方法更具表现力。