【发布时间】:2020-11-21 08:56:28
【问题描述】:
我正在尝试使用 .NET/C# 应用程序从 HTTP API 下载数据。即使 HttpClient 实例的超时设置为 30 分钟,请求超时也会快得多。今天我了解到这是因为 .NET HttpClient 不发送任何 TCP Keep Alive 数据包。 (这就是为什么我可以在 Chrome 中从该 API 下载数据的原因,正如 Wireshark 所证明的那样,Chrome 确实会发送这些数据包,而 HttpClient 不会。)
这就是我希望从 API 获取 JSON 数据的方式:
this.httpclient = new HttpClient();
[...]
result = await this.httpclient.GetAsync(url);
现在我做了一些研究,但我不知道如何发送这些 Keep Alive ping。 HttpClient 似乎不支持它们。所以我的猜测是打开连接时需要在套接字上启用这些。是否有任何解决方法,可能避免使用 HttpClient?我可以在套接字上以某种方式启用 Keep-Alive ping 吗?这是需要通过操作系统启用的功能吗?
请注意:这不是关于 HTTP“Connection: Keep-Alive”标头的!您可以为 HttpClient 类启用此功能,但由于显而易见的原因,它不会触发任何 TCP Keep Alive 数据包。
编辑: 当客户端发送这些 Keep-Alive 数据包时,请求始终有效,否则它们将失败。这可以通过使用不同的客户端/浏览器来重现。最佳示例:Postman Chrome 扩展确实发送 Keep-Alive 数据包,因此请求有效。使用几乎相同的 Postman 独立客户端,请求失败(或不返回任何数据),因为有趣的是,独立客户端不发送任何可以使用 Wireshark 轻松检查的 Keep-Alive 数据包。
编辑:我为这个问题找到了一个非常简单的解决方案,请参阅下面的答案。
【问题讨论】:
标签: c# .net tcp httpclient