Wir versuchen, benutzerdefiniert (auf einem Einstellungsbildschirm) optionale gzip-Komprimierung in unserem Client, der HttpClient
verwendet, zu implementieren, so dass wir Leistung über mehrere verschiedene Aufrufe protokollieren und vergleichen können Zeitspanne. Unser erster Versuch war einfach bedingt die Header hinzufügen, wie folgt:HttpClient: Bedingte AcceptEncoding-Komprimierung zur Laufzeit
HttpRequestMessage request = new HttpRequestMessage(Method, Uri);
if (AcceptGzipEncoding)
{
_client.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip"));
}
//Send to the server
result = await _client.SendAsync(request);
//Read the content of the result response from the server
content = await result.Content.ReadAsStringAsync();
dies die richtige Anfrage erstellt, aber die gzip-Antwort wurde nicht auf Rückkehr dekomprimiert, in einer verstümmelten Reaktion zur Folge hat. Ich fand, dass wir die HttpClientHandler
beim Bau der HttpClient
enthalten hatte:
HttpClient _client = new HttpClient(new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip
});
Das alles gut funktioniert, aber wir möchten ändern, ob der Client die Accept-Encoding: gzip
Header zur Laufzeit sendet, und es tut nicht scheint eine beliebige Möglichkeit zu sein, auf die HttpClientHandler
zuzugreifen oder sie zu ändern, nachdem sie an den HttpClient
-Konstruktor übergeben wurde. Darüber hinaus hat das Ändern der Header des Objekts HttpRequestMessage
keine Auswirkungen auf die Header der Anforderung, wenn sie von HttpClientHandler
definiert sind.
Gibt es eine Möglichkeit, dies zu tun, ohne die HttpClient
bei jeder Änderung neu zu erstellen?
Edit: Ich habe auch versucht, einen Verweis auf die HttpClientHandler
ändert AutomaticDecompression
zur Laufzeit zu ändern, aber das wirft diese Ausnahme:
Diese Instanz bereits eine oder mehr Anforderungen begonnen hat. Eigenschaften können nur vor dem Senden der ersten Anfrage geändert werden.
neugierig Gerade jetzt, dass Sie gesehen haben, wie praktisch automatische Dekompression ist, warum * nicht * erstellen Sie den Client bei jedem Zeit, dass sich die Einstellung ändert? Genau das würde ich hier machen, außer es gibt einen sehr guten Grund, es nicht zu tun. –
@ ToddMenier Das ist eine sehr gültige Frage. Es ist etwas, das wir in Betracht ziehen, aber es wird ein bisschen Umstrukturierung erfordern, denke ich, weil der gleiche HttpClient in eine Reihe von Bereichen eingebunden ist. Es handelt sich um eine Anwendung mittlerer Größe, die von früheren Entwicklern übernommen wurde. Daher müssen wir Änderungen nur sorgfältig verwalten. Wir werden uns diese Woche anschauen.Danke für die Kommentare und Hilfe. – pcdev