如何添加全球ASP.Net Web Api过滤器?

时间:2012-03-01 17:31:47

标签: asp.net-mvc-4 asp.net-web-api

我已经创建了一个Web Api过滤器(使用System.Web.Http.Filters.ActionFilterAttribute),但我无法让它在ASP.Net MVC 4中运行。我尝试将其添加到RegisterGlobalFilters()方法但那没有用。

因此,如果使用ASP.Net MVC中托管的Web Api,如何注册过滤器?

4 个答案:

答案 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文件中的全局过滤器相比,此方法更具表现力。