无法从传输连接读取数据:远程主机强制关闭现有连接

Ale*_*lex 85 .net c# ioexception

我有一个服务器应用程序,有时,当客户端尝试连接时,我收到以下错误:

在此输入图像描述

注意:"无法从客户端获取流或登录失败"是我在catch语句中添加的文本

它停止的行(sThread:第96行)是:

tcpClient = (TcpClient)client;
clientStream = tcpClient.GetStream();
sr = new StreamReader(clientStream);
sw = new StreamWriter(clientStream);

// line 96:                 
a = sr.ReadLine();
Run Code Online (Sandbox Code Playgroud)

可能是什么导致了这个问题?请注意,它不会一直发生

Han*_*onn 147

我在调用Web服务时收到此错误.该问题还与运输级安全有关.我可以通过网站项目调用Web服务,但是当在测试项目中重用相同的代码时,我会得到一个包含此消息的WebException.在进行调用之前添加以下行解决了问题:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

编辑

System.Net.ServicePointManager.SecurityProtocol - 此属性选择安全套接字层(SSL)或传输层安全性(TLS)协议的版本,以用于仅使用安全超文本传输​​协议(HTTPS)方案的新连接; 现有连接不会更改.

我相信SecurityProtocol在选择协议版本时,在TLS握手期间配置很重要.

TLS握手 - 此协议用于交换双方所需的所有信息,以便通过TLS交换实际应用程序数据.

ClientHello - 客户端发送ClientHello消息,指定它支持的最高TLS协议版本...

ServerHello - 服务器以ServerHello消息响应,包含所选的协议版本......所选的协议版本应该是客户端和服务器都支持的最高版本.例如,如果客户端支持TLS 1.1版并且服务器支持1.2版,则应选择版本1.1; 不应选择版本1.2.

  • 这救了我!谢啦.在我的调试器中,我试图在测试时调用https服务,并且遇到了OP所遇到的问题. (5认同)
  • 我们是否了解更多关于它如何/为何起作用?我一直在努力使用PostAsync调用,这似乎也解决了我的错误.很高兴它有效,但我也想知道为什么. (5认同)
  • 谢谢你!这让我发疯。 (3认同)
  • 请记住,这必须在您创建请求之前进行。归功于 - /sf/answers/4016450301/ (3认同)

Dav*_*vid 49

此错误通常表示目标计算机正在运行,但您尝试连接的服务不可用.(它停止,崩溃或忙于另一个请求.)

英文:已建立与机器(服务运行的远程主机/服务器/ PC)的连接,但由于该机器的服务不可用,因此机器不知道如何处理该请求.

如果与机器的连接不可用,您将看到不同的错误.我忘记了它是什么,但它是"服务无法访问"或"不可用".

编辑 - 添加

这可能是由防火墙阻塞端口引起的,但鉴于你说它是间歇性的("有时当客户端试图连接"时),这是不太可能的.我原本没有把它包括在内,因为我在回复之前已经在精神上排除了它.

  • 问题是,当我启动服务器时,大约有 50 个客户端连接到我的服务器。我在接受客户端时实现了某种等待信号..类似 while (Program.waitToFinishLoginAtClient == true && ajutor < 30) { Thread.Sleep(300); } 调节器++;} 客户端 = this.tcpListener.AcceptTcpClient(); Program.waitToFinishLoginAtClient = true; ...... 并且 Program.waitToFinishAtClient 在包含客户端的线程中被修改 (2认同)
  • 我认为等待是问题所在。我对你的代码了解不够,无法确定,但这听起来确实有可能。只是好奇您是否以“困难的方式”构建了自己的服务,或者您是否正在使用 WCF 甚至远程处理来实现此目的...... (2认同)

Hug*_*rio 27

我的具体情况是Azure应用服务将最小TLS版本更改为1.2

我不知道从现在开始这是否是默认值,但将其更改回1.0会使其正常工作.

您可以访问"SSL设置"中的设置.

  • 哦,天哪,谢谢你!我已经坚持了很久,我检查了网络应用程序的SSL设置,最小值设置为1.2而不是1.0.当我将其更改回1.0并重新启动Web应用程序时,它工作正常!非常感谢! (6认同)
  • 救了我的同伴! (2认同)

Ste*_*veC 15

不确定这些博客文章中的哪些修复程序有帮助,但其中一个为我排序了这个问题...

http://briancaos.wordpress.com/2012/07/06/unable-to-read-data-from-the-transport-connection-the-connection-was-closed/

帮助我的技巧是使用WebRequest退出并使用HttpWebRequest代替.HttpWebRequest允许我玩3个重要设置:

http://briancaos.wordpress.com/2012/06/15/an-existing-connection-was-forcibly-closed-by-the-remote-host/

  • 第1步:禁用KeepAlive
  • 第2步:将ProtocolVersion设置为Version10
  • 第3步:限制服务点数

  • 这个答案为我解决了同样的问题。我在 IIS7 的 Http Response Headers 部分关闭了“Keep Alive” (2认同)

Mah*_*ahi 14

据《汉斯·沃恩》回答。

在拨打电话之前添加以下行解决了问题:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

添加安全协议并正常工作后,但我必须在每个不健康的 API 调用之前添加。我只是将 .net 框架版本升级到至少 4.6 并且按预期工作不需要在每次 API 调用之前添加。


Job*_*col 10

从我们的一台服务器调用HTTPS服务也抛出" 无法从传输连接读取数据:现有连接被强行关闭 "异常.但是,HTTP服务运行良好.使用Wireshark看到它是TLS握手失败.结束了服务器上的密码套件需要更新.


Mah*_*ahi 6

这解决了我的问题。我在发出请求之前添加了这一行:

System.Net.ServicePointManager.Expect100Continue = false;
Run Code Online (Sandbox Code Playgroud)

似乎服务器中存在不支持 100 连续行为的代理。


Jon*_*ley 5

这对间歇性问题无济于事,但可能对遇到类似问题的其他人有用。

我克隆了一个虚拟机,并使用新的 IP 地址在不同的网络上启动它,但没有更改 IIS 中的绑定。Fiddler 向我显示“无法从传输连接读取数据:现有连接被远程主机强行关闭”,而 IE 则告诉我“在高级设置中打开 TLS 1.0、TLS 1.1 和 TLS 1.2”。将绑定更改为新 IP 地址为我解决了这个问题。


Zac*_*ber 5

对于那些以后可能会发现的人,在 .NET 4.6 版之后,我也遇到了这个问题。

确保检查 web.config 文件中的以下几行:

<compilation debug="true" targetFramework="4.5">
...
<httpRuntime targetFramework="4.5" />
Run Code Online (Sandbox Code Playgroud)

如果您在服务器上运行 4.6.x 或更高版本的 .NET,请确保调整这些 targetFramework 值以匹配您服务器上的框架版本。如果您的版本低于 4.6.x,那么我建议您升级 .NET 并使用新版本,除非您的代码依赖于旧版本(在这种情况下,您应该考虑更新它)。

我将 targetFrameworks 更改为 4.7.2,问题消失了:

<compilation debug="true" targetFramework="4.7.2">
...
<httpRuntime targetFramework="4.7.2" />
Run Code Online (Sandbox Code Playgroud)

较新的框架通过使用可用的最佳协议并阻止不安全或过时的协议来解决这个问题。如果您尝试连接或调用的远程服务出现此错误,则可能是它们不再支持旧协议。