如何添加全局ASP.Net Web Api筛选器?


98

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

因此,如果一个人使用的是ASP.Net MVC中托管的Web Api,一个寄存器如何过滤?

Answers:


110

Global.asax中的以下代码对我有用:

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

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

6
有人可以解释这是怎么回事吗?为什么会有两组全局过滤器?这不是使“全球”成为矛盾的话题吗?
路加·普普利特

6
一组过滤器用于MVC,另一组过滤器用于Web API。它们是两回事,通常您不希望将其中一个过滤器应用于另一个。
Shane Courtrille 2012年

2
我的WebApi筛选器被调用了两次。有人有这个问题吗?
安德鲁·卡拉什尼科夫,

87

请注意,此答案适用于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并命名ControllerWeb 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
}

或在global.asax.cs中:

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());

Mvc全局筛选器通过GlobalFilterCollection对象注册,可通过RegisterGlobalFiltersFilterConfig.cs方法为使用WebActivator的项目提供对象:

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

或通过GlobalFilters.Filters集合的方式在global.asax.cs文件中为那些没有WebActivator的用户提供:

GlobalFilters.Filters.Add(new MyMvcFilter());

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


对我来说,在webapiconfig.cs中添加自定义Web Api过滤器是可行的。我不明白为什么将它添加到global.asax.cs中时为何不起作用
Tatipaka 2016年

谢谢@tatipaka。添加到webapiconfig工作。
Gokulnath

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);
}

8

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

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

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


我创建了一个从System.Web.Http.Filters.ActionFilterAttribute继承的Filter,并继续在我需要的方法上直接使用它。它只是有效,所以我为什么不需要注册?
joedotnot

@joedotnot这是关于“全局”过滤器而不是特定的过滤器。如果可以指定要过滤的方法,则方法是可以的,但是无论控制器采取何种操作进行过滤时,都需要全局过滤器。
Mahmoud Moravej '19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.