Фильтр регистрации веб-API MVC 4

Я использую 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

Следующее должно работать. Мы фактически используем это для нашего проекта веб-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 и, по существу, используя фактические фильтры в качестве оберток, которые можно зарегистрировать в качестве фильтров.