0

我有一个连接到云服务器设置的客户端 - 一个 HAProxy 实例(几个之一,由负载平衡器确定),然后它将请求转发到正确的后端服务器。

从客户端的角度来看,这只是一个常量 URI,但是当负载均衡器切换处理请求的 HAProxy 实例时会出现问题。发生这种情况后,HttpClient 发送的每个后续请求都来自不同的本地端口,并被后端服务器视为新连接。

持久连接对应用程序至关重要,因此这会严重破坏它。奇怪的是,一旦客户端应用程序重新启动,问题就会自行解决。这让我相信问题出在客户端,而不是云设置或后端服务器。

我在这里缺少什么吗?我认为在连接通过一个 HAProxy 实例时创建 ServicePoint 的 ServicePointManager 可能存在问题,并且由于该对象在应用程序的生命周期内维护,因此通过第二个 HAProxy 实例使用它可能存在一些问题。重新启动应用程序时,ServicePoint 实例将丢失并重新创建。


更新:我注意到 ServicePoint 对象最初具有 HTTP 协议 1.1,但一旦出现问题,它已更改为 1.0。HTTP 1.1 默认有持久连接,而 HTTP 1.0 默认有临时连接。

如果我在一切正常时将 ServicePoint 对象协议更改为 1.0,我将收到 502 Bad Gateway 异常(尽管它似乎已恢复并更改回 1.1 以进行下一个请求)。

我猜云堆栈中的某些东西导致协议在负载平衡后更改为 1.0。

4

1 回答 1

1

当负载平衡器开关导致初始错误时,云堆栈中的某些东西似乎将响应 HTTP 版本设置为 1.0。然后,我的端点的客户端 ServicePoint 对象得到更新,因此 ServicePoint.HttpBehaviour 和 ServicePoint.ProtocolVersion 都是 1.0。

默认情况下,HTTP 1.1 具有持久连接,而 1.0 没有,因此连接不会保持活动状态。

将 ServicePoint.HttpBehaviour 改回 1.1 可以解决问题,尽管我确信可以在云服务器上进行适当的配置修复。

一个问题是 HttpBehaviour 和 ProtocolVersion 是私有属性(我正在通过 Visual Studio 调试器的快速查看进行更改)。它们应该可以通过反射进行更改,尽管我依赖于它在未来的 .NET 版本中不会被更改。

于 2018-07-05T15:56:38.490 回答