我有一个连接到云服务器设置的客户端-HAProxy实例(由负载均衡器确定的几个实例之一),然后它将请求转发到正确的后端服务器上。
从客户端角度来看,这只是一个常量URI,但是当负载平衡器切换处理请求的HAProxy实例时,就会出现问题。在这种情况发生之后,HttpClient发送的每个后续请求都来自不同的本地端口,并且后端服务器将其视为新连接。
持久连接对于应用程序至关重要,因此这会严重破坏它。奇怪的是,客户端应用程序重新启动后,问题便自行解决。这使我相信问题出在客户端,而不是云设置或后端服务器。
我这里缺少什么吗?我认为当连接通过一个HAProxy实例时,ServicePointManager创建ServicePoint可能是一个问题,并且由于在应用程序的整个生命周期中都维护了该对象,因此在第二个HAProxy实例中使用它可能存在一些问题。重新启动应用程序后,ServicePoint实例将丢失并重新创建。
更新:我注意到ServicePoint对象最初具有HTTP协议1.1,但是一旦出现问题,它就会更改为1.0。默认情况下,HTTP 1.1具有持久连接,而HTTP 1.0默认具有临时连接。
如果在一切正常的情况下将ServicePoint对象协议更改为1.0,我将收到502 Bad Gateway异常(尽管它似乎可以恢复并针对下一个请求更改回1.1)。
我猜测云堆栈中的某些内容导致负载平衡后协议更改为1.0。
答案 0 :(得分:0)
当负载均衡器开关引起初始错误时,似乎云堆栈中的某项将响应HTTP版本设置为1.0。然后更新了我端点的客户端的ServicePoint对象,以使ServicePoint.HttpBehaviour和ServicePoint.ProtocolVersion均为1.0。
HTTP 1.1默认具有持久性连接,而1.0没有,因此连接没有保持活动状态。
将ServicePoint.HttpBehaviour更改回1.1可解决此问题,尽管我确定可以在云服务器上完成适当的配置修复。
一个问题是HttpBehaviour和ProtocolVersion是私有属性(我通过Visual Studio调试器的快速监视进行了更改)。它们应该可以通过反射进行更改,尽管我依赖于将来的.NET版本中不进行更改。