101

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

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

4

4 回答 4

114

我的 Global.asax 中的以下代码适用于我:

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
  filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
于 2012-03-01T17:53:51.420 回答
93

请注意,这个答案适用于 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命名空间中定义的少数过滤器接口之一。

于 2014-04-15T20:59:18.380 回答
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);
}
于 2012-06-21T00:13:03.060 回答
8

而不是使用全局过滤器,我更喜欢这样做:

[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
   ...
}

之后继承所有的 api 控制器,CustomizedApiControllerBase 与 global.ascx 文件中的全局过滤器相比,这种方法更具表现力。

于 2014-03-01T11:20:22.360 回答