Asp.net mvc 4 如何添加全局ASP.NETWebAPI过滤器?

Asp.net mvc 4 如何添加全局ASP.NETWebAPI过滤器?,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我已经创建了一个Web Api过滤器(使用System.Web.Http.Filters.ActionFilterAttribute),但是我无法让它在ASP.NETMVC4中工作。我尝试将其添加到RegisterGlobalFilters()方法中,但没有成功 因此,如果使用ASP.Net MVC中托管的Web Api,如何注册过滤器?my Global.asax中的以下代码适用于我: public static void RegisterWebApiFilters(System.Web.Ht

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


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

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

与其使用全局过滤器,我更喜欢这样做:

[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
   ...
}
然后从
CustomizedApiControllerBase
与global.ascx文件中的全局过滤器相比,这种方法更具表现力

注意,这个答案在MVC 5/Web API 2中是正确的

简短回答:MVC和Web API过滤器不兼容,如果要全局注册它们,必须为每个过滤器使用适当的配置类

详细回答:ASP.NET MVC和Web API是专门设计用于以类似方式工作的,但实际上它们是不同的生物

WebAPI位于
System.Web.Http
命名空间下,而MVC位于
System.Web.MVC
命名空间下。两者将愉快地生活在一起,但其中一个并不包含另一个,尽管编程模型有相似之处,但底层实现是不同的。正如MVC控制器和Web API控制器继承不同的基本控制器类(MVC的简单名称为
controller
,Web API的名称为
ApiController
),MVC过滤器和Web API过滤器继承自不同的
FilterAttribute
类(在本例中,这两个类共享相同的名称,但都是独立的类,位于各自的名称空间中)

Web API全局筛选器是通过
HttpConfiguration
对象注册的,如果您在WebActivator中使用项目模板,则可在
Register
方法WebApiConfig.cs中使用该对象:

public static void Register(HttpConfiguration config)
{
    //stuff before
    config.Filters.Add(new MyWebApiFilter());
    //stuff after
}
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //stuff before
        filters.Add(new MyMvcFilter());
        //stuff after
    }
}
GlobalFilters.Filters.Add(new MyMvcFilter());
或者在global.asax.cs中:

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
Mvc全局筛选器通过
GlobalFilterCollection
对象注册,对于使用WebActivator的项目,您可以通过FilterConfig.cs的
RegisterGlobalFilters
方法使用该对象:

public static void Register(HttpConfiguration config)
{
    //stuff before
    config.Filters.Add(new MyWebApiFilter());
    //stuff after
}
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //stuff before
        filters.Add(new MyMvcFilter());
        //stuff after
    }
}
GlobalFilters.Filters.Add(new MyMvcFilter());
或者在global.asax.cs文件中,通过
GlobalFilters.Filters
集合为那些没有WebActivator的用户:

public static void Register(HttpConfiguration config)
{
    //stuff before
    config.Filters.Add(new MyWebApiFilter());
    //stuff after
}
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //stuff before
        filters.Add(new MyMvcFilter());
        //stuff after
    }
}
GlobalFilters.Filters.Add(new MyMvcFilter());

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

有人能解释一下这里发生了什么吗?为什么有两组全局过滤器?这难道不意味着“全局”是一个矛盾的说法吗?一组过滤器用于MVC,另一组用于Web API。它们是两个独立的东西,通常你不希望一个过滤器应用于另一个。我的WebApi过滤器被调用了两次。有人吗这个问题?在webapiconfig.cs中添加自定义Web Api过滤器对我来说很有效。我不明白为什么在global.asax.csthanks@tatipaka中添加时不起作用。添加到webapiconfig有效。我创建了一个从System.Web.Http.filters.ActionFilterAttribute继承的过滤器,并继续在我需要的方法上直接使用它。它是不起作用,那么为什么我不需要注册它?@joedotnot它是关于“全局”过滤器而不是特定的过滤器。如果您可以指定要过滤的方法,您的方法是可以的,但是当您想过滤而不考虑控制器操作时,您需要全局过滤器。