通过WebClient.DownloadData自动解压缩gzip响应
我希望自动解压GZiped响应。 我正在使用下面的代码片段:
mywebclient.Headers[HttpRequestHeader.AcceptEncoding] = "gzip"; mywebclient.Encoding = Encoding.UTF8; try { var resp = mywebclient.DownloadData(someUrl); }
我已经检查HttpRequestHeader enum
,并没有select通过Headers
做到这一点
我怎样才能自动解压缩resp? 或者是否有另一个function,我应该使用,而不是mywebclient.DownloadData
?
WebClient使用HttpWebRequest封面。 而HttpWebRequest支持gzip / deflate解压。 请参阅HttpWebRequest自动解压缩属性
但是,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 }
为了清晰,我创build了所有的临时variables。 这一切都可以扁平textResponse
只有client
和textResponse
。
或者,如果简单是目标,你甚至可以使用Demis Bellot的ServiceStack.Text来做到这一点:
using ServiceStack.Text; var resp = "some url".GetJsonFromUrl();
(还有其他.Get*FromUrl
扩展方法)