/ / ActionAttributeFilter vs. Delegatinghandler - Vorteile / Nachteile? - asp.net-web-api2

ActionAttributeFilter vs. Delegatinghandler - Vorteile / Nachteile? - asp.net-web-api2

Ich möchte eingehende Json-Daten aus der Anfrage und ausgehenden Json als Antwort protokollieren.

Nach einiger Suche ist mir aufgefallen, dass sowohl angepasste ActionAttributeFilter als auch DelegatingHandler verwendet werden können. Gibt es Vor- / Nachteile?

Antworten:

12 für die Antwort № 1

Vorteile / Nachteile hängen von Ihrem Bedarf ab.

Der Delegierungshandler hat eine viel höhere Hierarchie vonWeb-API-Anforderungsverarbeitung als ActionAttributeFilter. Wenn Sie Delegating Handler implementieren, erstellen Sie einen Message-Handler. Wenn Sie Aktionsfilter erstellen, erstellen Sie einen Filter, der unmittelbar vor der Aktionsmethode in der Pipeline ausgeführt wird.

Obwohl ein Message-Handler früher in ausgeführt wirdPipeline, kann es im Handel von Vorteil sein Anfragen zum frühestmöglichen Zeitpunkt. Der Message-Handler wird für alle Aktionsmethoden oder mindestens alle Aktionsmethoden einer Route ausgeführt. Dies sollte bei der Auswahl des Meldungshandlers zur Lösung eines Problems berücksichtigt werden. Aktionsfilter können auf einzelne Aktionsmethoden, alle Methoden in einem Controller oder alle Methoden auf allen Controllern angewendet werden Konfigurieren des Filters als globaler Filter.


2 für die Antwort № 2

Für Ihre speziellen Anforderungen, d. H. Zum Protokollieren von Anforderungen und Antworten, sollten Sie einen Delegierungshandler verwenden.

Der Vorteil ist, dass Sie ein Protokoll erstellen könnenObjekt aus der Anfrage UND die Antwort gleichzeitig. Dies liegt daran, dass der delegierende Handler die Anforderung und die Antwort ausführt und auf beide zugreifen kann.

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var log = new Log { Url = request.RequestUri };
var response = await base.SendAsync(request, cancellationToken);
log.ContentLength = response.ContentLength;
this.LogAsync(log);
return response;
}

Mit ActionFilter können Sie Methoden haben, die vor UND nach der Anforderung ausgeführt werden, jedoch nicht durchgehend. Daher müssen Sie die Korrelation der Protokolle irgendwie in Betracht ziehen.