2012-06-20 30 views
39

Wydaje się, że te dwa mają podobny cel. Byłoby wspaniale zobaczyć kilka przykładów, kiedy używać jednego z drugim, plusy i minusy, a także wskazywać na najważniejsze różnice.Kiedy używać HttpMessageHandler vs ActionFilter?

+1

http://forums.asp.net/t/1804456.aspx – user960567

+3

Lepszym pytaniem może być moment użycia HttpMessageHandler vs * global * ActionFilter. To wydaje się trochę bardziej mgliste. Filtry –

Odpowiedz

53

Główna różnica między nimi to ich ostrość. Message Handlery są stosowane do wszystkich żądań HTTP. Wykonują one funkcję pośrednika HTTP. Filtry mają zastosowanie tylko do żądań, które są wywoływane do określonego kontrolera/działania, w którym zastosowano filtr .

Powinieneś używać MessageHandlers, jeśli chcesz, aby zachowanie było stosowane w większości żądań. Filtry powinny być używane, gdy mają tylko zastosowanie do określonych zasobów.

enter image description here

+6

można również zastosować do wszystkich żądań HTTP, jeśli są one dodawane jako filtry globalne. – frennky

+2

Skąd to pochodzi? –

+2

http://blogs.msdn.com/b/kiranchalla/archive/2012/05/05/asp-net-mvc4-web-api-stack-diagram.aspx –

26

duża różnica pomiędzy obsługą i filtrów działania jest etapem, w którym są one wykonywane. Filtry działania są wykonywane po wysłaniu kontrolera i powiązaniu modelu, więc masz możliwość interakcji z instancją kontrolera, która obsługuje żądanie, a także ma bezpośredni dostęp do wpisanych obiektów modelu, które są przekazywane do metody działania. Użyłem tego podejścia do wykonania zaawansowanego rejestrowania wartości żądania/odpowiedzi - ponieważ mogłem uzyskać dostęp do kontrolera, mogłem rejestrować dodatkowe informacje o tym, jak obsługiwane było żądanie.

koparki wiadomości są wykonywane wcześniej w tym procesie, i działają znacznie bliżej do wartości surowego żądanie/odpowiedź niż filtrów (kontrastują z HttpRequestMessage/HttpResponseMessage przedmiotów używanych w teleskopowe z dużo-bogatszy HttpActionContext i HttpActionExecutedContext obiekty dostępne w ciągu filtrów). Dzięki temu są potencjalnie bardziej wydajne w przypadku niektórych działań, na przykład, jeśli próbujesz ustalić, czy musisz wcześniej przerwać żądanie. Jeśli wiesz, że żądanie powinno zostać odrzucone, program obsługi pozwoli ci to zrobić, zanim infrastruktura WebApi przejdzie do wysiłku tworzenia instancji kontrolera, wykonywania wiązania modelu itd.

Kolejną różnicą jest to, że procedury obsługi są powiązane, a masz większą kontrolę nad sposobem wykonywania łańcucha. Chociaż filtry są wywoływane w sekwencji, ustawienie odpowiedzi w jednym filtrze skutecznie kończy żądanie, uniemożliwiając wykonanie następnego filtru na liście. Na przykład, jeśli masz pierwszy filtr, który zwraca nieprawidłowe żądanie, jeśli Twój model ma wartość NULL, i drugi filtr do zalogowania się do żądania, drugi filtr nie zostanie wykonany, gdy złe żądanie zostanie wygenerowane przez pierwszy filtr. Z handler'em nadal będzie możliwe (choć niekoniecznie wskazane!), Aby wywołać obsługę wewnętrzną i pozwolić, aby łańcuch obsługi działał normalnie.

Powiązane problemy