Как добавить глобальные фильтры ASPI Web Api?
Я создал фильтр Web Api (используя System.Web.Http.Filters.ActionFilterAttribute
), но я не могу заставить его работать внутри ASP.Net MVC 4. Я попытался добавить его к методу RegisterGlobalFilters()
, но это не сработало.
Итак, если вы используете Web Api, размещенную в ASP.Net MVC, как один регистрирует фильтры?
Ответы
Ответ 1
Следующий код в моем Global.asax работает для меня:
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
Ответ 2
обратите внимание, что этот ответ выполняется до MVC 5/Web API 2
Краткий ответ: Фильтры MVC и Web API не являются перекрестно совместимыми, и если вы хотите зарегистрировать их по всему миру, вы должны использовать соответствующие классы конфигурации для каждого.
Длинный ответ: ASP.NET MVC и веб-API предназначены специально для работы аналогичным образом, но на самом деле это разные существа.
Web API живет в пространстве имен System.Web.Http
, тогда как MVC живет под пространством имен System.Web.Mvc
. Они будут счастливо жить бок о бок, но один не содержит другого, и, несмотря на сходство в модели программирования, базовые реализации различны. Так же, как контроллеры MVC и контроллеры Web API наследуют разные классы базового контроллера (MVC просто называется Controller
, а Web API называется ApiController
). Фильтры MVC и фильтры Web API наследуются от разных классов FilterAttribute
(оба имеют одинаковое имя в этот случай, но являются отдельными классами, которые живут в их соответствующих пространствах имен).
Глобальные фильтры Web API регистрируются через объект HttpConfiguration
, доступный вам в методе 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
для тех, у кого нет WebActivator:
GlobalFilters.Filters.Add(new MyMvcFilter());
Стоит отметить, что в обоих случаях вам не нужно наследовать соответствующий тип FilterAttribute
. Фильтры Web API должны реализовывать только интерфейс System.Web.Http.IFilter, тогда как регистрация фильтра MVC проверяется, чтобы убедиться, что ваш класс наследует одну из нескольких интерфейсов фильтра, определенных в пространстве имен System.Web.Mvc
.
Ответ 3
Как и MVC 4 RC, правильное имя класса HttpFilterCollection:
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
Ответ 4
Вместо использования глобальных фильтров я предпочитаю делать это:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
И после этого наследовать все контроллеры API от CustomizedApiControllerBase
Этот подход более выразителен по сравнению с глобальными фильтрами в файле global.ascx.