2012-03-01 14 views
83

Stworzyłem filtr Web Api (używając System.Web.Http.Filters.ActionFilterAttribute), ale nie mogę go uruchomić w ASP.Net MVC 4. Próbowałem dodać go do metody RegisterGlobalFilters(), ale to nie zadziałało.Jak dodać globalne filtry ASP.Net Web Api?

Więc jeśli używa się Web Api hostowanego w ASP.Net MVC, jak się rejestruje?

Odpowiedz

94

Poniższy kod, moim Global.asax, działa na mnie:

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters) 
{ 
    filters.Add(new MyWebApiFilter()); 
} 

protected void Application_Start() 
{ 
    RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters); 
} 
+6

Czy ktoś może wyjaśnić, co się tutaj dzieje? Dlaczego istnieją dwa zestawy filtrów globalnych? Czy to nie "Global" jest oksymoronem? –

+5

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. –

+2

Mój filtr WebApi jest wywoływany dwa razy. Czy ktoś ma ten problem? –

11

Jak MVC 4 RC, prawidłowa nazwa klasy jest HttpFilterCollection:

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters) 
{ 
    filters.Add(new MyWebApiFilter()); 
} 

protected void Application_Start() 
{ 
    RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters); 
} 
4

Zamiast filtry globalne Preferuję to:

[MyWebApiFilter] 
public class CustomizedApiControllerBase : ApiController 
{ 
    ... 
} 

I po dziedziczące wszystkie kontrolery api od CustomizedApiControllerBase To podejście jest bardziej ekspresyjne w porównaniu z globalnymi filtrami w pliku global.ascx.

62

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.

+0

Dodanie niestandardowych filtrów Web Api do webapiconfig.cs działa dla mnie. Nie rozumiem, dlaczego to nie zadziałało, gdy dodano w global.asax.cs – Tatipaka

+0

dzięki @tatipaka. dodanie do webapiconfig działało. – Gokulnath