MVC 4 Web API注册过滤器

10

我正在使用 MVC 4 Web API 为应用程序创建服务层。 我试图创建一个全局过滤器,以作用于所有传入到 API 的请求。现在我明白这必须与标准的 MVC 全局操作过滤器配置不同。但我在尝试使用网上找到的任何示例时都遇到了问题。

我遇到的问题是在向 Web API 注册过滤器。

我的 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路由和筛选器运行正常。我的WebApi路由也是如此。这是我为我的WebApi筛选器注册所拥有的内容...

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进行注册时运行良好,但当我尝试使用System.Web.Http.Filters.HttpFilterCollection进行注册时,会出现错误,指出它不能赋给System.Web.Http.Filters.IFilter参数类型。

因此,我认为我的PerformanceTestFilter需要继承自除ActionFilterAttribute之外的其他内容,以便作为webapi过滤器进行注册。但我不确定需要继承什么。

我想我需要创建两个单独的过滤器,分别与mvc和webapi配合使用。如果有办法创建一个可以注册到两者的过滤器,那就太棒了。但我主要关心的是让它在webapi中正常工作。

谢谢

1个回答

10
以下代码应该可以运行。我们实际上在我们的Web API项目中使用此代码。 GlobalConfiguration.Configuration.FiltersHttpFilterCollection类型的。
 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不起作用?

看起来你需要有两个过滤器,一个用于API,一个用于MVC。你可以将常见代码因素化到一个单独的类中,然后只需使用特定的过滤器调用通用类,从而不违反DRY原则,实际上使用过滤器作为可以注册为过滤器的包装器。


3
这个解决方案使我的项目能够构建,我已经将我的过滤器注册到Web API的“System.Web.Http.Filters.HttpFilterCollection”和标准MVC操作过滤器的“GlobalFilterCollection”。但是,当我导航到其中一个API方法时,该过滤器并没有被执行。该过滤器对于标准MVC控制器操作有效,但对于Web API方法无效。有什么建议吗? - jdavis
提出一个新问题。请勿在评论中提出新问题。 - Joshua Ramirez
2
@Sam,为什么你在添加自己的过滤器之前要清除过滤器集合? - Vegar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接