Я создал фильтр Web Api (использующий System.Web.Http.Filters.ActionFilterAttribute
), но я не могу заставить его работать внутри ASP.Net MVC 4. Я попытался добавить его в RegisterGlobalFilters()
метод, но это не сработало.
Итак, если вы используете Web Api, размещенный в ASP.Net MVC, как зарегистрировать фильтры?
asp.net-mvc-4
asp.net-web-api
Шейн Кортриль
источник
источник
обратите внимание, что этот ответ верен до 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:или иначе в global.asax.cs:
Глобальные фильтры MVC регистрируются с помощью
GlobalFilterCollection
объекта, который доступен вам черезRegisterGlobalFilters
метод FilterConfig.cs для проектов, использующих WebActivator:или в файле global.asax.cs путем
GlobalFilters.Filters
сбора для тех, у кого нет WebActivator:Стоит отметить, что в обоих случаях наследование от соответствующего
FilterAttribute
типа не требуется . Фильтры веб-API должны реализовывать только интерфейс System.Web.Http.IFilter, в то время как регистрация фильтра MVC проверяет, наследует ли ваш класс один из нескольких интерфейсов фильтра, определенных вSystem.Web.Mvc
пространстве имен.источник
Начиная с MVC 4 RC, правильное имя класса - HttpFilterCollection :
источник
Я предпочитаю использовать не глобальные фильтры:
И после этого унаследовать все контроллеры api от
CustomizedApiControllerBase
этого подхода более выразительно по сравнению с глобальными фильтрами в файле global.ascx.источник