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

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

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

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

я проверил HttpRequestHeader enumи нет возможности сделать это через Headers

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

2 ответа

Решение

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;
    }
}

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

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 от Demis Bellot:

using ServiceStack.Text;

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

(Есть и другие .Get*FromUrl методы расширения)

Другие вопросы по тегам