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