Skip to main content
 首页 » 编程设计

c#之为什么 HttpWebResponse 在 Content-Encoding 为空时尝试使用 GZip 解压缩流

2024年01月02日39luoye11

我看了很多关于这个主题的问答,然后我使用下面的代码从给定的 URI 中获取字节:

var request = (HttpWebRequest)WebRequest.Create(uri); 
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
var response = request.GetResponse(); 
var stream = response.GetResponseStream(); 
if (stream != null) 
{ 
    var buffer = new byte[4097]; 
    var memoryStream = new MemoryStream(); 
 
    do 
    { 
        var count = stream.Read(buffer, 0, buffer.Length); 
        memoryStream.Write(buffer, 0, count); 
 
        if (count == 0) 
            break; 
    } while (true); 
 
    return memoryStream.ToArray(); 
} 
 
response.Close(); 
 
return null; 

现在,对于某个 URI(指向一个文件),在调试时,我看到网络响应的“Content-Encoding” header 等于空(“”),但是在尝试从流,它抛出一个异常:

System.IO.InvalidDataException: The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.

在开发工具中调试相同的 URI 时,我在响应 header 上得到了这个:

Content-Encoding:gzip,deflate

所以我真的不知道会发生什么。

关于如何避免此异常并成功读取文件字节的任何线索和想法?

谢谢!

请您参考如下方法:

作为自动解压缩的一部分,.NET 框架将此 header 清空。我假设这是因为您要求框架自动处理它并且您返回的响应流不再压缩。

我必须通过检查源代码来自己查找 HttpWebResponse at Microsoft