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

Sha*_*lle 96 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,如何注册过滤器?

小智 109

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

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

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
Run Code Online (Sandbox Code Playgroud)

  • 有人能解释一下这里发生了什么吗?为什么有两套全局过滤器?这不会让"全球"变成矛盾吗? (6认同)
  • 一组过滤器用于MVC,另一组用于Web API.它们是两个独立的东西,通常你不希望过滤器用于另一个. (6认同)
  • 我的WebApi过滤器被调用两次.有人有这个问题吗? (2认同)

joe*_*dev 84

请注意,这个答案适用于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全局过滤器将通过WebApiConfig.cs方法中HttpConfiguration可用的对象进行注册Register:

public static void Register(HttpConfiguration config)
{
    //stuff before
    config.Filters.Add(new MyWebApiFilter());
    //stuff after
}
Run Code Online (Sandbox Code Playgroud)

或者在global.asax.cs中:

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
Run Code Online (Sandbox Code Playgroud)

Mvc全局过滤器是通过GlobalFilterCollection对象注册的RegisterGlobalFilters,对于使用WebActivator的项目,可以通过FilterConfig.cs 的方法使用该对象:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //stuff before
        filters.Add(new MyMvcFilter());
        //stuff after
    }
}
Run Code Online (Sandbox Code Playgroud)

或者在GlobalFilters.Filters没有WebActivator的情况下通过集合在global.asax.cs文件中:

GlobalFilters.Filters.Add(new MyMvcFilter());
Run Code Online (Sandbox Code Playgroud)

值得注意的是,在这两种情况下,您都不需要从适当的FilterAttribute类型继承.Web API过滤器只需实现System.Web.Http.IFilter接口,而MVC过滤器注册检查以确保您的类继承了System.Web.Mvc命名空间中定义的少数过滤器接口之一.


nuz*_*ilo 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);
}
Run Code Online (Sandbox Code Playgroud)


Mah*_*vej 8

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

[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

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