通过WebClient.DownloadData自动解压缩gzip响应

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)

  • 有没有具体的理由在这里使用"过度使用"(恕我直言)铸造代替"传统铸造"?如果你使用as,你一定要检查请求是否为非null,所以我想知道在这种情况下,假设GetWebRequest()的结果总是一个HttpWebRequest是不是更简单... (18认同)

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)

为清楚起见,我创建了所有临时变量.这一切都可以扁平化为clienttextResponse.

或者,如果简单是目标,你甚至可以使用Demis Bellot的ServiceStack.Text来做到这一点:

using ServiceStack.Text;

var resp = "some url".GetJsonFromUrl();
Run Code Online (Sandbox Code Playgroud)

(还有其他.Get*FromUrl扩展方法)