Jak dodać globalną ASP.Net filtry Web Api?
Stworzyłem Filtr Web Api (używając System.Web.Http.Filters.ActionFilterAttribute
), ale nie jestem w stanie go uruchomić wewnątrz ASP.Net MVC 4. Próbowałem dodać go do metody RegisterGlobalFilters()
, ale to nie zadziałało.
Więc jeśli ktoś używa Web Api hostowanego w ASP.Net MVC jak zarejestrować filtry?
4 answers
Następujący kod, w moim Global.asax, u mnie działa:
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 13:30:27
zauważ, że ta odpowiedź jest prawdziwa do MVC 5 / Web API 2
Krótka odpowiedź: filtry MVC i Web API nie są kompatybilne krzyżowo, a jeśli chcesz je zarejestrować globalnie, musisz użyć odpowiednich klas konfiguracyjnych dla każdej z nich.
Długa odpowiedź: ASP.NET MVC i Web API są celowo zaprojektowane tak, aby działać w podobny sposób, ale w rzeczywistości są to różne stworzenia.
Web API żyje w przestrzeni nazw System.Web.Http
, podczas gdy MVC żyje w przestrzeni nazw System.Web.Mvc
. Obie będą szczęśliwie żyć obok siebie, ale jedna nie zawiera drugiej i pomimo podobieństw w modelu programowania, podstawowe implementacje są różne. Podobnie jak kontrolery MVC i Web API dziedziczą różne podstawowe klasy kontrolerów (MVC 's to po prostu nazwa {[6] } i Web API' s to nazwa ApiController
) filtry MVC i Web API dziedziczą z różnych klas FilterAttribute
(obie mają tę samą nazwę w tym przypadku, ale są oddzielnymi klasami, które żyją w odpowiednich przestrzeniach nazw).
Filtry Globalne Web API są rejestrowane przez obiekt HttpConfiguration
Dostępny dla Ciebie w metodzie Register
WebApiConfig.cs jeśli używasz szablonu projektu z Webactivatorem:
public static void Register(HttpConfiguration config)
{
//stuff before
config.Filters.Add(new MyWebApiFilter());
//stuff after
}
Lub inaczej na świecie.asax.cs:
GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
Filtry Globalne Mvc są rejestrowane za pomocą obiektu GlobalFilterCollection
, który jest dostępny dla ciebie za pomocą metody Filtrconfig RegisterGlobalFilters
.cs dla projektów, które używają WebActivator:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
Lub w global.asax.plik cs poprzez zbiór GlobalFilters.Filters
dla osób bez Webactivatora:
GlobalFilters.Filters.Add(new MyMvcFilter());
Warto zauważyć, że w obu przypadkach nie trzeba dziedziczyć po odpowiednim typie FilterAttribute
. Filtry Web API wymagają jedynie wdrożenia systemu.Www.Http.IFilter interface, podczas gdy MVC filter registration sprawdza, czy Twoja klasa dziedziczy jeden z kilku interfejsów filtrów zdefiniowanych w przestrzeni nazw System.Web.Mvc
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-06 13:45:17
Od MVC 4 RC, poprawna nazwa klasy to HttpFilterCollection :
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 00:13:03
Zamiast używać filtrów globalnych wolę to robić:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
I po tym dziedziczyć wszystkie kontrolery api z CustomizedApiControllerBase
Takie podejście jest bardziej wyraziste w porównaniu z filtrami globalnymi w global.plik ascx.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-23 07:38:54