【问题标题】:How to add global ASP.Net Web Api Filters?如何添加全局 ASP.Net Web Api 过滤器?
【发布时间】:2012-03-20 05:35:12
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    以下代码在我的 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,另一组用于 Web API。它们是两个独立的东西,通常您不希望将一个过滤器应用于另一个。
    • 我的 WebApi 过滤器被调用了两次。有人有这个问题吗?
    【解决方案2】:

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

    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 命名空间中定义的少数过滤器接口之一。

    【讨论】:

    • 在 webapiconfig.cs 中添加自定义 Web Api 过滤器对我有用。我不明白为什么在 global.asax.cs 中添加时它不起作用
    • 感谢@tatipaka。添加到 webapiconfig 工作。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 我创建了一个继承自 System.Web.Http.Filters.ActionFilterAttribute 的过滤器,并继续在我需要的方法上直接使用它。它只是工作,所以我为什么不需要注册它?
      • @joedotnot 它是关于“全局”过滤器而不是特定过滤器。如果您可以指定要过滤的方法,那么您的方法是可以的,但是当您想要过滤而不考虑控制器操作时,您需要全局过滤器。
      猜你喜欢
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2016-02-23
      • 1970-01-01
      • 2019-11-11
      • 2022-01-05
      相关资源
      最近更新 更多