pamiętać, że ta odpowiedź odnosi się do MVC 5/Web API 2
Krótka odpowiedź: MVC i Web API filtry nie są krzyż kompatybilne, a jeśli chcesz, aby zarejestrować je globalnie, należy użyj odpowiednich klas konfiguracji dla każdego.
Długa odpowiedź: ASP.NET MVC i Web API są specjalnie zaprojektowane do pracy w podobny sposób, ale w rzeczywistości są to różne stworzenia.
Web API funkcjonuje w przestrzeni nazw System.Web.Http
, podczas gdy MVC znajduje się w przestrzeni nazw System.Web.Mvc
. Oboje z radością będą ż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 Web API dziedziczą różne klasy kontrolerów bazowych (MVC ma po prostu nazwę Controller
, a interfejsy API WWW mają nazwę ApiController
), filtry MVC i filtry Web API dziedziczą po różnych klasach FilterAttribute
(w tym przypadku oba mają takie same nazwy, ale są oddzielne klasy, które żyją w swoich przestrzeniach nazw).
Web API filtry globalne są rejestrowane przez obiekt HttpConfiguration
dostępne dla Ciebie w Register
metoda WebApiConfig.cs jeśli używasz szablonu projektu z WebActivator:
public static void Register(HttpConfiguration config)
{
//stuff before
config.Filters.Add(new MyWebApiFilter());
//stuff after
}
lub inaczej w global.asax. CS:
GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
MVC globalne filtry są zarejestrowane w drodze GlobalFilterCollection
obiektu, który jest do Państwa dyspozycji przez metody FilterConfig.cs RegisterGlobalFilters
projektów, że Ponowne korzystanie z WebActivator:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
lub w pliku global.asax.plik cs drodze GlobalFilters.Filters
kolekcja dla tych bez WebActivator:
GlobalFilters.Filters.Add(new MyMvcFilter());
Warto zauważyć, że w obu przypadkach nie trzeba dziedziczą z odpowiedniej FilterAttribute
typu. Filtry Web API wymagają jedynie implementacji interfejsu System.Web.Http.IFilter, podczas gdy rejestracja filtru MVC sprawdza, czy twoja klasa dziedziczy jeden z kilku interfejsów filtrów zdefiniowanych w przestrzeni nazw System.Web.Mvc
.
Czy ktoś może wyjaśnić, co się tutaj dzieje? Dlaczego istnieją dwa zestawy filtrów globalnych? Czy to nie "Global" jest oksymoronem? –
Jeden zestaw filtrów jest dla MVC, a drugi dla Web API. Są to dwie osobne rzeczy i zwykle nie chciałbyś, aby filtry były stosowane w stosunku do drugiego. –
Mój filtr WebApi jest wywoływany dwa razy. Czy ktoś ma ten problem? –