HttpWebRequest&本机GZip压缩

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

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

我正在使用本地GZipStream解压缩,并正在寻找解决这个问题。 有鉴于此,是否有解决这个或另一个GZip库(免费?),这将正确处理这个问题的工作?

我正在validationwebResponse ContentEncoding是GZIP

5/11更新一个简化的snippit

//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属性呢? 只需添加:

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

它还将gzip,deflate添加到accept编docker。

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

你正在冲洗和closuresstream? 尝试使用使用语句包装您的GZipStream。

我发现了一些示例代码,显示了GZip编码页面的整个请求/响应。 它使用GZipStream。

http://www.know24.net/blog/Decompress+GZip+Deflate+HTTP+Responses.aspx

看到我上面的评论,但这通常是一个损坏的文件的症状。 如果该网站是您自己的,请replace您尝试访问的文件。

对于.NET Core来说,更复杂一些。 一个GZipStream是需要的,因为没有一个属性(写作) AutomaticCompression GZipStream 。 看到我的答案在这里: https : //stackoverflow.com/a/44508724/2421277

来自答案的代码:

 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}"; } } } 

本地GZipStream可以读取压缩的GZIP( RFC 1952 )stream,但不能处理ZIP文件格式。

http://www.geekpedia.com/tutorial190_Zipping-files-using-GZipStream.html

在第三方产品上使用GZipStream类的缺点是它的能力有限。 其中一个限制是,你不能给你放在档案中的文件命名。 当GZipStream将文件压缩成ZIP存档时,它将从该文件获取字节序列,并使用压缩algorithm创build较小的字节序列。 新的字节序列被放入新的ZIP文件。 当您打开ZIP文件时,您将打开存档文件本身; 最受欢迎的ZIP提取器(WinZip,WinRar等)将显示ZIP的内容为与存档本身相同的文件。


编辑:上面的笔记是不正确的 。 GZipStream不会生成一个ZIP文件。 这不是“单个文件的ZIPstream”。 这是一个GZIPstream。 他们是不同的东西。 不能保证处理ZIP档案的工具会处理.gz档案。


对于可以读取ZIP存档的实现,而不是单个文件ZIPstream,请尝试#ziplib(SharpZipLib,以前称为NZipLib) 。