Как добавить глобальные фильтры ASPI Web Api?

Я создал фильтр Web Api (используя System.Web.Http.Filters.ActionFilterAttribute ), но я не могу заставить его работать внутри ASP.Net MVC 4. Я попытался добавить его к методу RegisterGlobalFilters() но это didn Не работай.

Итак, если вы используете Web Api, размещенную в ASP.Net MVC, как регистрировать фильтры?

Следующий код в моем Global.asax работает для меня:

 public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters) { filters.Add(new MyWebApiFilter()); } protected void Application_Start() { RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters); } 

обратите внимание, что этот ответ выполняется до MVC 5 / Web API 2

Короткий ответ: фильтры MVC и Web API не являются перекрестно совместимыми, и если вы хотите зарегистрировать их по всему миру, вы должны использовать соответствующие classы конфигурации для каждого.

Длинный ответ: ASP.NET MVC и веб-API предназначены специально для работы аналогичным образом, но на самом деле это разные существа.

Веб-API живет в System.Web.Http имен System.Web.Http , тогда как MVC живет в System.Web.Mvc имен System.Web.Mvc . Они будут счастливо жить бок о бок, но один не содержит другого, и, несмотря на сходство в модели программирования, базовые реализации различны. Подобно тому, как controllerы MVC и controllerы Web API наследуют разные classы базового controllerа (MVC просто называется Controller а Web API называется ApiController ). Фильтры MVC и фильтры Web API наследуются от разных classов FilterAttribute (оба имеют одно и то же имя в этом случае, но являются отдельными classы, которые живут в их соответствующих пространствах имен).

Глобальные фильтры Web API регистрируются через объект HttpConfiguration ansible вам в методе Register WebApiConfig.cs, если вы используете шаблон проекта с WebActivator:

 public static void Register(HttpConfiguration config) { //stuff before config.Filters.Add(new MyWebApiFilter()); //stuff after } 

или иначе в global.asax.cs:

 GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter()); 

Глобальные фильтры Mvc регистрируются посредством объекта GlobalFilterCollection , который доступен вам через метод RegisterGlobalFilters FilterConfig.cs для проектов, которые используют WebActivator:

 public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //stuff before filters.Add(new MyMvcFilter()); //stuff after } } 

или в файле global.asax.cs с GlobalFilters.Filters коллекции GlobalFilters.Filters для тех, у кого нет WebActivator:

 GlobalFilters.Filters.Add(new MyMvcFilter()); 

Стоит отметить, что в обоих случаях вам не нужно наследовать соответствующий тип FilterAttribute . Фильтры Web API должны реализовывать только интерфейс System.Web.Http.IFilter, тогда как регистрация фильтра MVC проверяется, чтобы ваш class наследовал одну из нескольких фильтрующих интерфейсов, определенных в System.Web.Mvc имен System.Web.Mvc .

Что касается MVC 4 RC, правильным именем classа является HttpFilterCollection :

 public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters) { filters.Add(new MyWebApiFilter()); } protected void Application_Start() { RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters); } 

Вместо использования глобальных фильтров я предпочитаю делать это:

 [MyWebApiFilter] public class CustomizedApiControllerBase : ApiController { ... } 

И после этого наследуйте все controllerы api из CustomizedApiControllerBase Этот подход более выразителен в сравнении с глобальными фильтрами в файле global.ascx.

  • WCF vs ASP.NET Web API
  • 401 ответ на запрос CORS в IIS с включенным Windows Auth
  • Включить CORS в Web API 2
  • Каковы накладные расходы на создание нового HttpClient на один вызов в клиенте WebAPI?
  • Перенаправление из asp.net web api post action
  • Пользовательская авторизация в Asp.net WebApi - какой беспорядок?
  • Страница HTTP 404 не найдена в Web Api, размещенной в IIS 7.5
  • ApiController возвращает 404, когда идентификатор содержит период
  • Как вернуть необработанную строку с ApiController?
  • HttpSelfHostServer и HttpContext.Current
  • Как настроить ASP.NET Web API AuthorizeAttribute для необычных требований
  • Давайте будем гением компьютера.