Stiamo provando a implementare la compressione gzip facoltativa determinata dall'utente (su una schermata delle impostazioni) nel nostro client che utilizza HttpClient
, in modo che possiamo registrare e confrontare le prestazioni su un numero di chiamate diverse su un periodo di tempo. Il nostro primo tentativo è stato quello di aggiungere semplicemente condizionato l'intestazione come segue:HttpClient: Compressa AcceptEncoding impostata in modo condizionale durante il runtime
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();
Questo ha creato la richiesta corretta, ma la risposta gzip non è stato decompresso il ritorno, con una conseguente risposta confusa. Ho scoperto che abbiamo dovuto includere la HttpClientHandler
quando si costruisce la HttpClient
:
HttpClient _client = new HttpClient(new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip
});
Tutto questo funziona bene, ma ci piacerebbe cambiare se il client invia l'intestazione Accept-Encoding: gzip
in fase di esecuzione, e non ci fa sembra essere un modo per accedere o modificare il HttpClientHandler
dopo che è passato al costruttore HttpClient
. Inoltre, la modifica delle intestazioni dell'oggetto HttpRequestMessage
non ha alcun effetto sulle intestazioni della richiesta se sono definite dallo HttpClientHandler
.
C'è un modo per farlo senza ricreare il HttpClient
ogni volta che questo cambia?
Edit: Ho provato anche di modificare un riferimento al HttpClientHandler
di cambiare AutomaticDecompression
in fase di esecuzione, ma che sta lanciando questa eccezione:
Questa istanza è già iniziata una o più richieste. Le proprietà possono essere modificate solo prima di inviare la prima richiesta.
Solo per curiosità, ora che avete visto come a portata di mano decompressione automatica è, perché * non * ricreare il client ogni tempo che l'impostazione cambia? Questo è esattamente quello che farei qui, a meno che non ci sia un buon motivo per non farlo. –
@ToddMenier Questa è una domanda molto valida. È qualcosa che stiamo considerando, ma credo che richieda un po 'di ristrutturazione, perché lo stesso HttpClient è legato a una serie di aree. Si tratta di un'applicazione di dimensioni contenute, ereditata dagli sviluppatori precedenti, quindi dobbiamo gestire con attenzione le modifiche. Lo vedremo questa settimana.Grazie per i commenti e l'aiuto. – pcdev