HttpClient: de manière Conditionnelle AcceptEncoding de compression au moment de l'exécution
Nous essayons de mettre en œuvre déterminé par l'utilisateur (sur un écran des paramètres) en option compression gzip dans nos client qui utilise HttpClient
, de sorte que nous pouvons nous connecter et de comparer les performances dans un certain nombre de différents appels sur une période de temps. Notre première tentative a été de simplement conditionnellement ajouter l'en-tête comme suit:
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();
Cela a créé la bonne demande, mais le format de la réponse n'a pas été décompressé sur le retour, résultant dans brouillé la réponse. J'ai trouvé que nous avons dû inclure le HttpClientHandler
lors de la construction de la HttpClient
:
HttpClient _client = new HttpClient(new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip
});
Tout cela fonctionne bien, mais nous aimerions changer si le client envoie la Accept-Encoding: gzip
en-tête au moment de l'exécution, et il ne semble pas être un moyen d'accéder ou de modifier le HttpClientHandler
après qu'il est passé à la HttpClient
constructeur. En outre, de modifier les en-têtes de la HttpRequestMessage
objet n'a aucun effet sur les en-têtes de la requête si ils sont définis par la HttpClientHandler
.
Est-il possible de faire cela sans avoir à recréer le HttpClient
chaque fois que cela change?
Edit: j'ai aussi essayé de modifier une référence à la HttpClientHandler
de changer AutomaticDecompression
au moment de l'exécution, mais que de lancer cette exception:
Cette instance a déjà commencé, en une ou plusieurs demandes. Les propriétés ne peuvent être modifiés avant l'envoi de la première demande.
C'est une très bonne question. C'est quelque chose que nous envisageons, mais il faudra un peu de restructuration, je pense, parce que la même HttpClient est attaché dans un certain nombre de domaines. C'est un de taille moyenne d'application de l'héritage des développeurs, donc nous avons juste à gérer les changements avec soin. Nous allons être à la recherche à elle de cette semaine. Merci pour les commentaires et de l'aide.
OriginalL'auteur pcdev | 2015-02-26
Vous devez vous connecter pour publier un commentaire.
Vous y êtes presque dans le premier exemple, vous avez juste besoin de dégonfler le flux vous-même. MME de GZipSteam aidera avec cela:
OriginalL'auteur Todd Menier
Si vous souhaitez utiliser le même HttpClient et ne voulez activer la compression pour certaines demandes, vous n'êtes pas en mesure d'utiliser décompression automatique. Lors de la décompression automatique est activée, le cadre réinitialise également le
Content-Encoding
en-tête de la réponse. Cela signifie que vous êtes incapable de savoir si la réponse était vraiment compressé ou non. Par la façon dont, aussi laContent-Length
en-tête de la réponse correspond à la taille de l'décompressé le contenu si vous activez la décompression automatique.Si vous avez besoin de décompresser le contenu manuellement. L'exemple suivant montre une mise en œuvre pour compressée par gzip contenu (comme l'indique @ToddMenier de réponse):
OriginalL'auteur Markus
Que par les commentaires ci-dessus, en recréant le HttpClient est vraiment la seule (robuste) façon de le faire. Manuel de décompression peut être atteint, mais il semble être très difficile de manière fiable/efficace de déterminer si le contenu a été codée ou non, afin de déterminer s'il convient d'appliquer le décodage.
OriginalL'auteur pcdev