обратите внимание, что этот ответ остается верным вплоть до MVC 5 / Web API 2
Краткий ответ: Фильтры MVC и Web API несовместимы, и есливы хотите зарегистрировать их глобально, вы должны использовать соответствующие классы конфигурации для каждого.
Длинный ответ: ASP.NET MVC и Web API специально предназначены для работы аналогичным образом, нона самом деле они разные существа.
Веб-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
.