MVC 4 Web API寄存器filter

我正在使用MVC 4 Web API为应用程序创建服务层。 我正在尝试创建一个全局filter,它将对API的所有传入请求起作用。 现在我明白这必须配置不同于标准的MVC全局动作filter。 但我遇到的问题是我在网上找到的任何一个例子。

我遇到的问题是使用Web API注册filter。

我的Global.asax设置如下……

public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); MVCConfig.RegisterRoutes(RouteTable.Routes); MVCConfig.RegisterGlobalFilters(GlobalFilters.Filters); WebApiConfig.RegisterRoutes(GlobalConfiguration.Configuration); WebApiConfig.RegisterGlobalFilters(GlobalConfiguration.Configuration.Filters); } } 

我的标准Mvc路由和filter正常工作。 和我的WebApi路由一样。 以下是我对webApifilter注册的内容…

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

这是PerformanceTestFilter ……

 public class PerformanceTestFilter : ActionFilterAttribute { private readonly Stopwatch _stopWatch = new Stopwatch(); public override void OnActionExecuting(ActionExecutingContext filterContext) { _stopWatch.Reset(); _stopWatch.Start(); } public override void OnActionExecuted(ActionExecutedContext filterContext) { _stopWatch.Stop(); var executionTime = _stopWatch.ElapsedMilliseconds; // Do something with the executionTime } } 

当使用标准Mvc GlobalFilterCollection注册时,此filter工作正常,但是当我尝试使用System.Web.Http.Filters.HttpFilterCollection注册它时,我收到一条错误消息,指出它不能分配给参数类型System.Web.Http。 Filters.IFilter。

所以我假设我的PerformanceTestFilter需要inheritanceActionFilterAttribute以外的东西才能注册为webapifilter。 我只是不确定需要做什么。

我想我需要创建两个单独的filter来分别使用mvc和webapi。 如果有办法创建一个可以注册到两者的filter,那将是很好的。 但我主要关心的是让它适用于webapi。

谢谢

以下应该有效。 我们实际上将它用于我们的Web API项目。

GlobalConfiguration.Configuration.Filters的类型为HttpFilterCollection

  var filters = System.Web.Http.GlobalConfiguration.Configuration.Filters; filters.Clear(); filters.Add(new ValidationActionFilterAttribute()); public class ValidationActionFilterAttribute : FilterAttribute, IActionFilter, IFilter { ... } 

此外,如果您正在一个包含MVC和WebAPI组件的项目中工作,您可以检查ActionFilterAttribute命名空间的命名空间是什么。 这是相当令人困惑的,因为两者下都有两个ActionFilterAttributes:

  System.Web.Http.Filters System.Web.Http.Mvc 

来源: 为什么我的ASP.NET Web API ActionFilterAttribute OnActionExecuting没有触发?

您似乎需要有两个filter,一个用于API,另一个用于MVC。 您可以将公共代码分解为一个单独的类,然后只使用特定的filter调用您的公共类,从而不违反DRY并且实际上使用实际的filter作为可以注册为filter的包装器。