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

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

mywebclient.Headers[HttpRequestHeader.AcceptEncoding] = "gzip"; mywebclient.Encoding = Encoding.UTF8; try { var resp = mywebclient.DownloadData(someUrl); } 

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

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

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

Однако class 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 } 

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

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

 using ServiceStack.Text; var resp = "some url".GetJsonFromUrl(); 

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

  • C # WebClient отключить кеш
  • Выбор между HttpClient и WebClient
  • HTTP POST возвращает ошибку: 417 «Ожидание не выполнено».
  • Как мне войти на сайт с помощью WebClient?
  • C # webclient и прокси-сервер
  • Как я могу заставить WebClient использовать Cookies?
  • Распаковка gzip-ответа от WebClient
  • Как отправить данные на определенный URL-адрес с помощью WebClient в C #
  • Использование CookieContainer с classом WebClient
  • WebClient vs. HttpWebRequest / HttpWebResponse
  • Как получить код статуса из веб-клиента?
  • Давайте будем гением компьютера.