HttpWebRequest &原生 GZip 压缩 [英] HttpWebRequest & Native GZip Compression

查看:23
本文介绍了HttpWebRequest &原生 GZip 压缩的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请求使用 Gzip 压缩的页面时,我收到很多以下错误:

When requesting a page with Gzip compression I am getting a lot of the following errors:

System.IO.InvalidDataException:GZip 页脚中的 CRC 与CRC 从解压后计算出来的数据

System.IO.InvalidDataException: The CRC in GZip footer does not match the CRC calculated from the decompressed data

我正在使用本机 GZipStream 进行解压缩,并且正在考虑解决这个问题.考虑到这一点,是否有解决此问题或其他 GZip 库(免费?)可以正确处理此问题的解决方法?

I am using native GZipStream to decompress and am looking at addressing this. With that in mind is there a work around for addressing this or another GZip library (free?) which will handle this issue properly?

我正在验证 webResponse ContentEncoding 是 GZIP

I am verifying the webResponse ContentEncoding is GZIP

更新 5/11一个简化的片段

//Caller
public void SOSampleGet(string url) 
{
    // Initialize the WebRequest.
    webRequest = (HttpWebRequest)WebRequest.Create(url);
    webRequest.Method = WebRequestMethods.Http.Get;
    webRequest.KeepAlive = true;
    webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    webRequest.Headers.Add("Accept-Encoding", "gzip,deflate");
    webRequest.Referer = WebUtil.GetDomain(url);

    HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();    

    using (Stream stream = GetStreamForResponse(webResponse, READTIMEOUT_CONST))
    {
        //use stream
    }
}

//Method
private static Stream GetStreamForResponse(HttpWebResponse webResponse, int readTimeOut)
{
    Stream stream;
    switch (webResponse.ContentEncoding.ToUpperInvariant())
    {
        case "GZIP":
            stream = new GZipStream(webResponse.GetResponseStream(), CompressionMode.Decompress);
            break;
        case "DEFLATE":
            stream = new DeflateStream(webResponse.GetResponseStream(), CompressionMode.Decompress);
            break;

        default:
            stream = webResponse.GetResponseStream();
            stream.ReadTimeout = readTimeOut;
            break;
        }    
    return stream;
}

推荐答案

自 .net 2 起可用的 webrequest AutomaticDecompression 属性怎么样?只需添加:

What about the webrequest AutomaticDecompression Property available since .net 2? Simply add:

webRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

它还将 gzip,deflate 添加到接受编码标头中.

It also adds the gzip,deflate to the accept encoding header.

请参阅 http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.automaticdecompression.aspx

这篇关于HttpWebRequest &原生 GZip 压缩的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆