如何添加全局ASP.NETWebApi筛选器?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (59)

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

因此,如果有人使用ASP.Net MVC托管的Web Api,那么一个注册过滤器如何?

提问于
用户回答回答于

在我的Global.asax中,下面的代码对我有用:

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

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
用户回答回答于

注意,这个答案适用于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
}

或者在global.asax.cs中:

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

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

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

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

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

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

扫码关注云+社区

领取腾讯云代金券