Utworzyłem filtr Web Api (używając System.Web.Http.Filters.ActionFilterAttribute
), ale nie mogę go uruchomić wewnątrz ASP.Net MVC 4. Próbowałem dodać go do RegisterGlobalFilters()
metody, ale to nie zadziałało.
Więc jeśli ktoś korzysta z interfejsu API sieci Web hostowanego w ASP.Net MVC, w jaki sposób można zarejestrować filtry?
asp.net-mvc-4
asp.net-web-api
Shane Courtrille
źródło
źródło
Zwróć uwagę, że ta odpowiedź jest prawdą do MVC 5 / Web API 2
Krótka odpowiedź: filtry MVC i Web API nie są wzajemnie kompatybilne i jeśli chcesz zarejestrować je globalnie, musisz użyć odpowiednich klas konfiguracji dla każdego z nich.
Długa odpowiedź: ASP.NET MVC i Web API są celowo zaprojektowane do działania w podobny sposób, ale w rzeczywistości są różnymi stworzeniami.
Interfejs API sieci Web znajduje się w
System.Web.Http
przestrzeni nazw, a MVC - wSystem.Web.Mvc
przestrzeni nazw. Oba będą szczęśliwie żyć obok siebie, ale jeden nie zawiera drugiego i pomimo podobieństw w modelu programowania, podstawowe implementacje są różne. Tak jak kontrolery MVC i kontrolery interfejsu API sieci Web dziedziczą różne klasy kontrolerów bazowych (nazwy MVC są po prostu nazwane,Controller
a nazwy interfejsów API sieci WebApiController
) Filtry MVC i filtry interfejsu API sieci Web dziedziczą z różnychFilterAttribute
klas (w tym przypadku oba mają tę samą nazwę, ale są oddzielnymi klasami, które działają w odpowiednich przestrzeniach nazw).Filtry globalne interfejsu API sieci Web są rejestrowane za pośrednictwem
HttpConfiguration
obiektu dostępnego wRegister
metodzie WebApiConfig.cs, jeśli używasz szablonu projektu z narzędziem WebActivator:lub w inny sposób w global.asax.cs:
Filtry globalne MVC są rejestrowane za pomocą
GlobalFilterCollection
obiektu, który jest dostępny za pośrednictwemRegisterGlobalFilters
metody FilterConfig.cs dla projektów korzystających z WebActivator:lub w pliku global.asax.cs w
GlobalFilters.Filters
celu pobrania dla osób bez WebActivatora:Warto zaznaczyć, że w obu przypadkach nie musisz dziedziczyć po odpowiednim
FilterAttribute
typie. Filtry interfejsu API sieci Web muszą implementować tylko interfejs System.Web.Http.IFilter, podczas gdy rejestracja filtru MVC sprawdza, czy klasa dziedziczy jeden z kilku interfejsów filtrów zdefiniowanych wSystem.Web.Mvc
przestrzeni nazw.źródło
Począwszy od MVC 4 RC, poprawna nazwa klasy to HttpFilterCollection :
źródło
Zamiast używać filtrów globalnych, wolę to zrobić:
Następnie odziedzicz wszystkie kontrolery API z
CustomizedApiControllerBase
To podejście jest bardziej wyraziste w porównaniu z globalnymi filtrami w pliku global.ascx.źródło