HttpClient AutomaticDecompression 与 gzip 一起使用,而不是放气

Posted

技术标签:

【中文标题】HttpClient AutomaticDecompression 与 gzip 一起使用,而不是放气【英文标题】:HttpClient AutomaticDecompression working with gzip, not deflate 【发布时间】:2020-02-09 06:08:43 【问题描述】:

同时使用 httpbin 和 Postman Echo(这似乎是同一个服务,实际上),我能够通过他们的测试端点成功获得 gzip 的响应,如下所示:

var cli = new HttpClient(new HttpClientHandler

    AutomaticDecompression = DecompressionMethods.GZip
);
await cli.GetAsync("https://postman-echo.com/gzip");

但如果我用他们的 deflate 测试端点做同样的事情:

var cli = new HttpClient(new HttpClientHandler

    AutomaticDecompression = DecompressionMethods.Deflate
);
await cli.GetAsync("https://postman-echo.com/deflate");

我得到以下异常/内部异常,从System.Net.Http.HttpContent.LoadIntoBufferAsync 抛出:

----> System.Net.Http.HttpRequestException : Error while copying content to a stream.
----> System.IO.IOException : The read operation failed, see inner exception.
----> System.Net.Http.WinHttpException : Operation aborted

我可以在 .NET Core 和 .NET Framework 中重现。请注意,这些都可以在浏览器中正常工作:

https://postman-echo.com/gzip

https://postman-echo.com/deflate

很容易认为这是测试服务的一个错误,但由于浏览器可以很好地处理它,其他平台上的库也是如此(他们的测试套件很广泛,但他们不是 .NET 人),我真的不知道指向哪个方向。这个异常到底告诉我什么?

【问题讨论】:

尝试手动将Content-Encoding 标头添加到您的请求中,以验证导致问题的一方。 谢谢。我认为您的意思是请求中的Accept-encoding 对吗?我确实尝试过,但没有任何区别,可能应该提到它。 是的,我的意思是Accept-Encoding 如果您尝试过,请尝试在 .NET 上测试的另一个测试存储库。 我很乐意尝试不同的测试服务,但我不知道。 【参考方案1】:

不知道它是否仍然相关,但这确实是 .net 中的 bug,最近才出现在 .net 6 中的 fixed。

【讨论】:

以上是关于HttpClient AutomaticDecompression 与 gzip 一起使用,而不是放气的主要内容,如果未能解决你的问题,请参考以下文章

轻松把玩HttpClient之封装HttpClient工具类,插件式配置HttpClient对象

Httpclient4.5.*HttpClient请求,对于新建httpclient实例时保持会话

HttpClient学习整理

httpclient简介说明

httpClient 保持session

httpclient post