обратите внимание, что этот ответ справедливо до 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
, а веб-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 для проектов, что re using WebActivator:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
или в глобальном масштабе.CS-файл путем GlobalFilters.Filters
коллекции для тех, кто не WebActivator:
GlobalFilters.Filters.Add(new MyMvcFilter());
Стоит отметить, что в обоих случаях вам не нужно наследовать от соответствующего FilterAttribute
типа. Фильтры Web API должны реализовывать только интерфейс System.Web.Http.IFilter, в то время как регистрация фильтра MVC проверяет, чтобы ваш класс наследовал одну из нескольких интерфейсов фильтра, определенных в пространстве имен System.Web.Mvc
.
Может кто-нибудь объяснить, что здесь происходит? Почему существуют два набора глобальных фильтров? Разве это не делает «Глобальный» оксюморон? –
Один набор фильтров для MVC, а другой для Web API. Это две разные вещи, и обычно вам не нужны фильтры для одного приложения к другому. –
Мой фильтр WebApi вызывается дважды. У кого-нибудь эта проблема? –