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?

Author: Shane Courtrille, 2012-03-01

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);
}
 111
Author: Dave Bettin,
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.

 88
Author: joelmdev,
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);
}
 12
Author: nuzzolilo,
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.

 8
Author: Mahmoud Moravej,
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