【发布时间】:2018-02-09 09:56:56
【问题描述】:
我有一个执行 GET 请求的 .NET Core 2.0 控制台应用程序。
似乎已发布的版本没有在测试机器上发送Accept-Encoding 标头进行压缩,但在我的本地机器上工作。
我找不到任何其他会使压缩失败的前置请求。两者都运行 .NET Core 2.1.4 SDK。
我已经通过在两种环境中运行 dotnet Console.dll 测试了控制台应用程序。
- 在 VS2017 中发布
- 转到输出文件夹并运行
dotnet Console.dll。验证 Fiddler 中是否存在标头。 - 复制整个输出文件夹并部署到服务器上
- 再次运行
dotnet Console.dll并使用 Fiddler 验证服务器上缺少的标头。
HttpClient 和 RestSharp 我都试过了,我很困惑。
转到响应请求标头的页面的概念证明:
var handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
};
using (var client = new HttpClient(handler))
{
response = client.GetStringAsync("http://scooterlabs.com/echo").Result;
}
本地环境(Win10)
GET http://scooterlabs.com/echo HTTP/1.1
Connection: Keep-Alive
Accept-Encoding: gzip, deflate
Host: scooterlabs.com
服务器(AWS 上的 Win2008 R2)
GET http://scooterlabs.com/echo HTTP/1.1
Connection: Keep-Alive
Host: scooterlabs.com
【问题讨论】:
-
那是请求标头。我不确定 scooterlabs 使用什么。编辑:我尝试使用 WebClient,这似乎在服务器上运行良好,所以 HttpClient 实现中的某些东西似乎不起作用?
-
HttpClient 工作得很好。在您的示例中,您不 使用 HttpClient,您使用的是 RestClient。无论如何,如果压缩不起作用,成千上万的开发人员会在 5 年前注意到。
-
写一个minimal, reproducible的例子,使用Fiddler来检查HTTP请求和响应。如果请求标头存在并且服务不压缩响应,则 HttpClient 没有问题
-
如果你自己添加标题(并删除
AutomaticDecompression)呢? -
@JunWeiLee 换一种说法——我在 Core 2.0 上使用 HttpClient 并且压缩有效。你假设它没有。 服务器 不是 HttpClient。如果标头没有到达服务器,则可能是某些东西(例如防火墙)将其删除。服务器是否首先支持压缩?你是如何配置服务器的?什么是服务器?
标签: c# .net .net-core dotnet-httpclient