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