Автоматически распаковывать ответ gzip через WebClient.DownloadData

Я хочу автоматически распаковать GZiped-ответ. Я использую следующий фрагмент:

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

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

Я проверил HttpRequestHeader enum, и нет возможности сделать это с помощью Headers

Как я могу автоматически распаковать файл? или Есть ли другая функция, которую я должен использовать вместо mywebclient.DownloadData?

Ответ 1

WebClient использует HttpWebRequest под обложками. И HttpWebRequest поддерживает дезакцию gzip/deflate. См. Свойство HttpWebRequest AutomaticDecompression

Однако класс WebClient не предоставляет это свойство напрямую. Таким образом, вам придется извлечь из него, чтобы установить свойство в базовом HttpWebRequest.

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

Ответ 2

В зависимости от вашей ситуации проще выполнить декомпрессию.

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

try
{
    var client = new WebClient();
    client.Headers[HttpRequestHeader.AcceptEncoding] = "gzip";
    var responseStream = new GZipStream(client.OpenRead(myUrl), CompressionMode.Decompress);
    var reader = new StreamReader(responseStream);
    var textResponse = reader.ReadToEnd();

    // do stuff

}

Я создал все временные переменные для ясности. Все это можно сгладить только до client и textResponse.

Или, если простота является целью, вы можете сделать это, используя ServiceStack.Text by Demis Bellot:

using ServiceStack.Text;

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

(Существуют другие методы расширения .Get*FromUrl)