我已经创建了一个Web Api过滤器(使用System.Web.Http.Filters.ActionFilterAttribute
),但我无法让它在ASP.Net MVC 4中运行。我尝试将其添加到RegisterGlobalFilters()
方法但那没有用。
因此,如果使用ASP.Net MVC中托管的Web Api,如何注册过滤器?
答案 0 :(得分:103)
我的Global.asax中的以下代码对我有用:
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
答案 1 :(得分:79)
请注意,这个答案适用于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全局过滤器将通过HttpConfiguration
方法WebApiConfig.cs中可用的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
对象注册的,对于使用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
命名空间中定义的少数过滤器接口之一。
答案 2 :(得分:12)
从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);
}
答案 3 :(得分:8)
我更愿意这样做而不是使用全局过滤器:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
然后从CustomizedApiControllerBase
继承所有api控制器
与global.ascx文件中的全局过滤器相比,此方法更具表现力。