Как добавить глобальные фильтры 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.

  • 404 после добавления веб-API в существующее веб-приложение MVC
  • Аутентификация веб-API ASP.NET MVC 4 с помощью поставщика членства
  • Почему HttpContext.Current null после ожидания?
  • Сериализовать контейнер перечислений в виде строк с помощью JSON.net
  • Не удалось выполнить сериализацию ответа в Web API с помощью Json
  • Вернуть строку JSON явно из Asp.net WEBAPI?
  • ASP.net MVC4 WebApi маршрут с именем файла в нем
  • Как метод в MVC WebApi сопоставляется с http-глаголом?
  • Аутентификация на основе токенов в ядре ASP.NET
  • Поместить контент в объект HttpResponseMessage?
  • Async WebApi Thread.CurrentCulture
  • Давайте будем гением компьютера.