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