Автоматически распаковывать ответ 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
)