Jul*_*s A 42 .net gzip webclient
我希望自动解压缩GZiped的响应.我使用以下代码段:
mywebclient.Headers[HttpRequestHeader.AcceptEncoding] = "gzip";
mywebclient.Encoding = Encoding.UTF8;
try
{
var resp = mywebclient.DownloadData(someUrl);
}
Run Code Online (Sandbox Code Playgroud)
我已经检查了HttpRequestHeader enum,没有选择通过这个来做到这一点Headers
如何自动解压缩resp?或者我应该使用另一种功能而不是mywebclient.DownloadData?
fer*_*oze 101
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*ins 26
根据您的情况,自己进行减压可能更简单.
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
}
Run Code Online (Sandbox Code Playgroud)
为清楚起见,我创建了所有临时变量.这一切都可以扁平化为client和textResponse.
或者,如果简单是目标,你甚至可以使用Demis Bellot的ServiceStack.Text来做到这一点:
using ServiceStack.Text;
var resp = "some url".GetJsonFromUrl();
Run Code Online (Sandbox Code Playgroud)
(还有其他.Get*FromUrl扩展方法)