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