解压缩xml提要

时间:2016-12-09 16:15:51

标签: c# .net xmlreader compression

我的应用程序从网上下载压缩的xml文件并尝试创建XML阅读器:

var fullReportUrl = "http://..."; // valid url here
//client below is an instance of HttpClient
var fullReportResponse = client.GetAsync(fullReportUrl).Result;

var zippedXmlStream = fullReportResponse.Content.ReadAsStreamAsync().Result;

XmlReader xmlReader = null;
using(var gZipStream = new GZipStream(zippedXmlStream, CompressionMode.Decompress)) 
{
    try 
    {
        xmlReader = XmlReader.Create(gZipStream, settings);
    } 
    catch (Exception xmlEx) 
    {

    }
}

当我尝试创建XML阅读器时出现错误:

“GZip标头中的幻数不正确。请确保传入GZip流。

enter image description here

当我在浏览器中使用URL时,我成功下载了一个包含格式良好的XML的zip文件。我的操作系统能够解压缩而没有任何问题。我检查了下载文件的前两个字符,它们似乎是'PK',与ZIP格式一致。

我可能会错过流转换中的一个步骤。我究竟做错了什么?

1 个答案:

答案 0 :(得分:1)

您无需使用GzipStream解压缩HttpClient的任何http响应。您可以使用HttpClientHandler AutomaticDecompressionHttpClient自动为您解压缩请求。

HttpClientHandler handler = new HttpClientHandler()
{
    // both gzip and deflate
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};

using (var client = new HttpClient(handler))
{
    var fullReportResponse = client.GetAsync(fullReportUrl).Result;
}

修改1:

Web服务器不会gzip输出所有请求。首先,他们检查accept-encoding标头,如果标头已设置且类似于Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5,则Web服务器了解客户端可以支持gzipdeflate,因此Web服务器可能(取决于在应用程序逻辑或服务器配置上)将输出压缩为gzipdeflate。在您的方案中,我认为您没有设置accept-encoding标头,因此Web响应将返回未压缩。虽然我建议你尝试上面的代码。

Read more about accept-encoding on MDN