Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 负载平衡器更改后,HttpClient停止重新使用连接_C#_Httpclient_Bad Gateway_Servicepointmanager - Fatal编程技术网

C# 负载平衡器更改后,HttpClient停止重新使用连接

C# 负载平衡器更改后,HttpClient停止重新使用连接,c#,httpclient,bad-gateway,servicepointmanager,C#,Httpclient,Bad Gateway,Servicepointmanager,我有一个连接到云服务器设置的客户端—一个HAProxy实例(由负载平衡器确定的几个实例之一),然后它将请求转发到正确的后端服务器 从客户机的角度来看,这只是一个常量URI,但当负载平衡器切换处理请求的HAProxy实例时会出现问题。发生这种情况后,HttpClient发送的每个后续请求都来自不同的本地端口,并被后端服务器视为新连接 持久连接对应用程序至关重要,因此这主要会破坏它。奇怪的是,只要客户端应用程序重新启动,问题就会自行解决。这让我相信问题在于客户端,而不是云设置或后端服务器 这里有我遗

我有一个连接到云服务器设置的客户端—一个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坏网关异常(尽管在下一个请求中它似乎会恢复并更改回1.1)


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

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

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

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


一个问题是HttpBehavior和ProtocolVersion是私有属性(我通过VisualStudio调试器的QuickWatch进行了更改)。它们应该可以通过反射进行更改,尽管我依赖于它在将来的.NET版本中不会被更改。

您如何使用您的HttpClient?它们是用using语句包装起来的,还是你在处理它们?或者您正在使用单例实例?HttpClient实例通常保存在服务器上,但如果服务器关闭连接,则可以将其释放。