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。过滤器.IFilter。

所以我假设我的 PerformanceTestFilter 需要从 ActionFilterAttribute 以外的东西继承才能注册为 webapi 过滤器。我只是不确定那需要是什么。

我想我需要创建两个单独的过滤器来分别使用 mvc 和 webapi。如果有一种方法可以创建一个可以同时注册到两者的过滤器,那就太好了。但我主要关心的是让它为 webapi 工作。

谢谢

4

1 回答 1

10

以下应该工作。我们实际上将它用于我们的 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 没有触发?

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

于 2013-02-20T14:22:59.930 回答