我正在使用一个商业应用程序,它正在抛出带有消息的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字节长度的数据包.但这究竟意味着什么?
发生两种可能性之一,我不确定,
1)连接正在关闭,但数据随后被写入套接字,从而产生上述异常.0#0只表示没有发送任何内容,因为套接字已经关闭.
2)连接仍然是打开的,并且正在发送一个零字节的数据包(即代码有一个错误),0#0表示正在尝试发送一个零字节的数据包.
你怎么看?我想这可能是不确定的,但也许其他人已经看到过这种事情了?
这通常意味着远程端关闭连接(通常通过发送TCP/IP RST
数据包).如果您正在使用第三方应用程序,可能的原因是:
您正在向应用程序发送格式错误的数据
客户端和服务器之间的网络链接由于某种原因而下降
您已在第三方应用程序中触发了导致其崩溃的错误
第三方应用程序已耗尽系统资源
第一种情况可能就是发生了什么.
您可以启动Wireshark以准确查看电线上发生的情况以缩小问题范围.
没有更具体的信息,这里的任何人都不可能真正帮助你.
使用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
您需要重新启动计算机才能使这些更改生效.
这不是代码中的错误.它来自.Net的Socket实现.如果您使用EndReceive的重载实现,如下所示,您将不会得到此异常.
SocketError errorCode; int nBytesRec = socket.EndReceive(ar, out errorCode); if (errorCode != SocketError.Success) { nBytesRec = 0; }
解决这个常见烦人问题的简单方法:
只需转到" .context.cs"文件(位于 "*.edmx"文件下的" .context.tt"下).
然后,将此行添加到构造函数中:
public DBEntities() : base("name=DBEntities") { this.Configuration.ProxyCreationEnabled = false; // ADD THIS LINE ! }
希望这是有帮助的.
有同样的错误.实际上工作的情况是使用一些代理(在我的情况下是小提琴手)发送流量.更新了从4.5.2到> = 4.6的.NET框架,现在一切正常.实际的要求是:
new WebClient().DownloadData("URL");
例外是:
SocketException:远程主机强制关闭现有连接