我正在使用一个商业应用程序,它抛出了一个SocketException消息,
远程主机强制关闭现有连接
这发生在客户端和服务器之间的套接字连接上。连接是正常的,并且正在传输大量数据,但随后突然断开连接。
有人见过这个吗?原因可能是什么?我能猜到一些原因,但是有没有办法在这段代码中添加更多的原因来找出原因是什么?
欢迎任何评论/想法。
... 最新的…
我有一些日志从一些。net跟踪,
System.Net.Sockets Verbose: 0 : [8188] Socket#30180123::Send() DateTime=2010-04-07T20:49:48.6317500Z
System.Net.Sockets Error: 0 : [8188] Exception in the Socket#30180123::Send - An existing connection was forcibly closed by the remote host DateTime=2010-04-07T20:49:48.6317500Z
System.Net.Sockets Verbose: 0 : [8188] Exiting Socket#30180123::Send() -> 0#0
根据日志记录的其他部分,我看到了这样一个事实:它说0#0意味着正在发送一个长度为0字节的数据包。但这到底是什么意思呢?
有两种可能,我不确定是哪一种,
连接正在关闭,但随后数据正在写入套接字,从而创建了上述异常。0#0仅仅意味着没有发送任何东西,因为套接字已经关闭。
连接仍然是打开的,并且正在发送一个零字节的数据包(即代码有一个错误),而0#0意味着一个零字节的数据包正在试图发送。
你怎么看?我猜这可能是不确定的,但也许有人见过这种东西?
使用TLS 1.2解决了这个错误。
你可以强制你的应用程序使用TLS 1.2(确保在调用你的服务之前执行它):
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
另一个解决方案:
在您的本地机器或服务器中启用强加密以使用TLS1.2,因为默认情况下它是禁用的,因此只使用TLS1.0。
要启用强加密,在PowerShell中以管理员权限执行以下命令:
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
您需要重新启动计算机才能使这些更改生效。
我们正在使用SpringBoot服务。我们的restTemplate代码如下所示:
@Bean
public RestTemplate restTemplate(final RestTemplateBuilder builder) {
return builder.requestFactory(() -> {
final ConnectionPool okHttpConnectionPool =
new ConnectionPool(50, 30, TimeUnit.SECONDS);
final OkHttpClient okHttpClient =
new OkHttpClient.Builder().connectionPool(okHttpConnectionPool)
// .connectTimeout(30, TimeUnit.SECONDS)
.retryOnConnectionFailure(false).build();
return new OkHttp3ClientHttpRequestFactory(okHttpClient);
}).build();
}
在restTemplate设置ReadTimeout后,我们所有的调用都失败了。我们延长了时间,问题就解决了。