我的应用程序从网上下载压缩的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流。
当我在浏览器中使用URL时,我成功下载了一个包含格式良好的XML的zip文件。我的操作系统能够解压缩而没有任何问题。我检查了下载文件的前两个字符,它们似乎是'PK',与ZIP格式一致。
我可能会错过流转换中的一个步骤。我究竟做错了什么?
答案 0 :(得分:1)
您无需使用GzipStream
解压缩HttpClient
的任何http响应。您可以使用HttpClientHandler AutomaticDecompression
让HttpClient
自动为您解压缩请求。
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服务器了解客户端可以支持gzip
或deflate
,因此Web服务器可能(取决于在应用程序逻辑或服务器配置上)将输出压缩为gzip
或deflate
。在您的方案中,我认为您没有设置accept-encoding
标头,因此Web响应将返回未压缩。虽然我建议你尝试上面的代码。