43 votes

Décompressez automatiquement la réponse gzip via WebClient.DownloadData

Je souhaite décompresser automatiquement la réponse GZiped. J'utilise l'extrait suivant:

 mywebclient.Headers[HttpRequestHeader.AcceptEncoding] = "gzip";
mywebclient.Encoding = Encoding.UTF8;

try
{
    var resp = mywebclient.DownloadData(someUrl);
}
 

J'ai vérifié HttpRequestHeader enum , et il n'y a pas d'option pour le faire via les Headers

Comment puis-je décompresser automatiquement le resp? ou Y a-t-il une autre fonction que je devrais utiliser à la place de mywebclient.DownloadData ?

102voto

feroze Points 3433

WebClient utilise HttpWebRequest sous les couvertures. Et HttpWebRequest prend en charge la décompression gzip / deflate. Voir la propriété HttpWebRequest AutomaticDecompression

Cependant, la classe WebClient n'expose pas cette propriété directement. Vous devrez donc en dériver pour définir la propriété sur le HttpWebRequest sous-jacent.

 class MyWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
        request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
        return request;
    }
}
 

26voto

Ben Collins Points 11318

Selon votre situation, il peut être plus simple de faire la décompression vous-même.

using System.IO.Compression;
using System.Net;

try
{
    var client = new WebClient();
    var responseStream = new GzipStream(client.OpenRead(myUrl), CompressionMode.Decompress);
    var reader = new StreamReader(responseStream);
    var textResponse = reader.ReadToEnd();

    // do stuff

}

J'ai créé toutes les variables temporaires pour plus de clarté. Cela peut être aplatie à seulement client et textResponse.

Ou, si la simplicité est le but, vous pourriez même le faire à l'aide de ServiceStack.Texte par Demis Bellot:

using ServiceStack.Text;

var resp = "some url".GetJsonFromUrl();

(Il y a d'autres .Get*FromUrl les méthodes d'extension)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X