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.Httpprzestrzeni nazw, a MVC - w System.Web.Mvcprzestrzeni 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, Controllera nazwy interfejsów API sieci Web ApiController) Filtry MVC i filtry interfejsu API sieci Web dziedziczą z różnych FilterAttributeklas (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 HttpConfigurationobiektu dostępnego w Registermetodzie 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ą GlobalFilterCollectionobiektu, który jest dostępny za pośrednictwem RegisterGlobalFiltersmetody 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.Filterscelu pobrania dla osób bez WebActivatora:
GlobalFilters.Filters.Add(new MyMvcFilter());
Warto zaznaczyć, że w obu przypadkach nie musisz dziedziczyć po odpowiednim FilterAttributetypie. 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.Mvcprzestrzeni nazw.