2012-06-20 2 views
39

Es scheint, dass diese beiden einen ähnlichen Zweck haben. Es wäre großartig, einige Beispiele zu sehen, in denen man Vor- und Nachteile gegeneinander abwägen könnte, und auf die wichtigsten Unterschiede hinzuweisen.Wann verwenden Sie HttpMessageHandler vs ActionFilter?

+1

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

+3

Bessere Frage könnte sein, wenn Sie HttpMessageHandler vs einen * globalen * ActionFilter verwenden. Das scheint etwas trüber. –

Antwort

53

Der Hauptunterschied zwischen ihren beiden ist ihr Fokus. Nachricht Handler werden auf alle HTTP-Anfragen angewendet. Sie führen die Funktion eines HTTP-Vermittlers aus. Filter gelten nur für Anforderungen, die an den bestimmten Controller/Aktion gesendet werden, wo der Filter angewendet wird.

Sie sollten MessageHandlers verwenden, wenn das Verhalten auf die überwiegende Mehrheit der Anforderungen angewendet werden soll. Filter sollten verwendet werden, wenn sie nur für bestimmte Ressourcen gelten.

enter image description here

+6

Filter können auch auf alle HTTP-Anfragen angewendet werden, wenn sie als globale Filter hinzugefügt werden. – frennky

+2

Woher kommt das? –

+2

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

26

ein großer Unterschied zwischen Handler und Aktionsfilter ist die Phase, in der sie ausgeführt werden. Aktionsfilter werden nach dem Controller-Dispatch und der Modellbindung ausgeführt, sodass Sie mit der Controller-Instanz, die die Anfrage verarbeitet, interagieren und direkten Zugriff auf die typisierten Modellobjekte haben können, die an die Aktionsmethode übergeben werden. Ich habe diesen Ansatz verwendet, um eine erweiterte Protokollierung von Anforderungs-/Antwortwerten durchzuführen. Da ich den Controller erreichen konnte, konnte ich zusätzliche Informationen darüber erfassen, wie die Anforderung gehandhabt wurde.

Message-Handler sind früher in den Prozess, und arbeiten sehr viel näher an den rohen Request/Response-Werte als Filter (Kontrast die HttpRequestMessage/HttpResponseMessage Objekten in Handler mit dem viel reicheren HttpActionContext und HttpActionExecutedContext Objekte innerhalb von Filter) ausgeführt. Dies macht sie für einige Aktivitäten möglicherweise effizienter, wenn Sie beispielsweise feststellen möchten, ob Sie die Anforderung vorzeitig beenden müssen. Wenn Sie wissen, dass die Anforderung zurückgewiesen werden soll, wird Ihnen ein Handler dies ermöglichen, bevor die WebApi-Infrastruktur die Instanziierung des Controllers, das Ausführen der Modellbindung usw. durchgeführt hat.

Ein weiterer Unterschied ist, dass Handler angekettet sind und dass Sie haben mehr Kontrolle darüber, wie die Kette ausgeführt wird. Obwohl Filter nacheinander aufgerufen werden, wird durch das Festlegen der Antwort in einem Filter die Anforderung effektiv beendet, wodurch verhindert wird, dass der nächste Filter in der Liste ausgeführt wird. Wenn Sie beispielsweise einen ersten Filter haben, der eine ungültige Anforderung zurückgibt, wenn Ihr Modell null ist, und einen zweiten Filter, um die Anforderung zu protokollieren, wird Ihr zweiter Filter nicht ausgeführt, sobald die ungültige Anforderung vom ersten Filter generiert wurde. Mit einem Handler wäre es immer noch möglich (obwohl nicht unbedingt ratsam!), Den inneren Handler aufzurufen und es der Handlerkette zu erlauben, normal zu arbeiten.