Descomprime automáticamente la respuesta de gzip a través de WebClient.DownloadData

Deseo descomprimir GZiped automáticamente. Estoy usando el siguiente fragmento:

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

He comprobado HttpRequestHeader enum , y no hay ninguna opción para hacer esto a través de los Headers

¿Cómo puedo descomprimir automáticamente el resp? o ¿Hay alguna otra función que deba usar en lugar de mywebclient.DownloadData ?

WebClient utiliza HttpWebRequest debajo de las cubiertas. Y HttpWebRequest es compatible con descompresión gzip / deflate. Consulte la propiedad HttpWebRequest AutomaticDecompression

Sin embargo, la clase WebClient no expone esta propiedad directamente. Por lo tanto, deberá derivar de ella para establecer la propiedad en HttpWebRequest subyacente.

 class MyWebClient : WebClient { protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest; request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; return request; } } 

Dependiendo de su situación, puede ser más sencillo hacer la descompresión usted mismo.

 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 } 

Creé todas las variables temporales para mayor claridad. Todo esto puede aplanarse solo para el client y textResponse .

O bien, si la meta es la simplicidad, incluso podría hacer esto usando ServiceStack.Text por Demis Bellot :

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

(Hay otros métodos de extensión .Get*FromUrl )