Автоматически распаковывает gzip-ответ через WebClient.DownloadData - PullRequest
42 голосов
/ 04 июня 2010

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

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

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

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

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

Ответы [ 2 ]

99 голосов
/ 06 февраля 2011

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;
    }
}
25 голосов
/ 10 сентября 2013

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

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 методы расширения)

...