首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >HttpWebRequest和本机GZip压缩

HttpWebRequest和本机GZip压缩
EN

Stack Overflow用户
提问于 2009-05-08 13:55:18
回答 6查看 61.7K关注 0票数 61

当请求一个带有Gzip压缩的页面时,我得到了很多下面的错误:

System.IO.InvalidDataException: GZip页脚中的CRC与从解压缩数据计算出的CRC不匹配

我正在使用原生GZipStream解压,并正在考虑解决这个问题。考虑到这一点,有没有办法解决这个或另一个GZip库(免费?)哪个会正确地处理这个问题?

我正在验证webResponse ContentEncoding是否为GZIP

更新5/11 A简化代码片段

代码语言:javascript
复制
//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;
}
EN

回答 6

Stack Overflow用户

发布于 2011-10-15 09:38:32

从.net 2开始提供的webrequest AutomaticDecompression属性怎么样?只需添加:

代码语言:javascript
复制
webRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

它还将gzip、deflate添加到accept编码头。

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

票数 135
EN

Stack Overflow用户

发布于 2017-06-13 05:08:32

对于.NET来说,核心的事情要稍微复杂一些。由于AutomaticCompression没有属性(在编写时),因此需要一个GZipStream。在这里看我的答案:https://stackoverflow.com/a/44508724/2421277

答案中的代码:

代码语言:javascript
复制
var req = WebRequest.CreateHttp(uri);

/*
 * Headers
 */
req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";

/*
 * Execute
 */
try
{
    using (var resp = await req.GetResponseAsync())
    {
        using (var str = resp.GetResponseStream())
        using (var gsr = new GZipStream(str, CompressionMode.Decompress))
        using (var sr = new StreamReader(gsr))

        {
            string s = await sr.ReadToEndAsync();  
        }
    }
}
catch (WebException ex)
{
    using (HttpWebResponse response = (HttpWebResponse)ex.Response)
    {
        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
        {
            string respStr = sr.ReadToEnd();
            int statusCode = (int)response.StatusCode;

            string errorMsh = $"Request ({url}) failed ({statusCode}) on, with error: {respStr}";
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2009-05-08 14:58:44

您是否正在冲刷并关闭流?尝试使用Using语句包装您的GZipStream。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/839888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档