我已经创建了一个Web Api过滤器(使用System.Web.Http.Filters.ActionFilterAttribute
),但是无法使其在ASP.Net MVC 4中运行。我试图将其添加到该RegisterGlobalFilters()
方法中,但这没有用。
因此,如果一个人使用的是ASP.Net MVC中托管的Web Api,一个寄存器如何过滤?
我已经创建了一个Web Api过滤器(使用System.Web.Http.Filters.ActionFilterAttribute
),但是无法使其在ASP.Net MVC 4中运行。我试图将其添加到该RegisterGlobalFilters()
方法中,但这没有用。
因此,如果一个人使用的是ASP.Net MVC中托管的Web Api,一个寄存器如何过滤?
Answers:
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
FilterConfig.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
命名空间中定义的少数筛选器接口之一。
我不使用全局过滤器,而是这样做:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
然后,从CustomizedApiControllerBase
该方法继承所有api控制器。与global.ascx文件中的全局过滤器相比,此方法更具表现力。