Asp.net mvc 4 如何添加全局ASP.NETWebAPI过滤器?
我已经创建了一个Web Api过滤器(使用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
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它是关于“全局”过滤器而不是特定的过滤器。如果您可以指定要过滤的方法,您的方法是可以的,但是当您想过滤而不考虑控制器操作时,您需要全局过滤器。