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 - w System.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 Web ApiController
) Filtry MVC i filtry interfejsu API sieci Web dziedziczą z różnych FilterAttribute
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 w Register
metodzie WebApiConfig.cs, jeśli używasz szablonu projektu z narzędziem WebActivator:
public static void Register(HttpConfiguration config)
{
//stuff before
config.Filters.Add(new MyWebApiFilter());
//stuff after
}
lub w inny sposób w global.asax.cs:
GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
Filtry globalne MVC są rejestrowane za pomocą GlobalFilterCollection
obiektu, który jest dostępny za pośrednictwem RegisterGlobalFilters
metody FilterConfig.cs dla projektów korzystających z WebActivator:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
lub w pliku global.asax.cs w GlobalFilters.Filters
celu pobrania dla osób bez WebActivatora:
GlobalFilters.Filters.Add(new MyMvcFilter());
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 w System.Web.Mvc
przestrzeni nazw.