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.
Dav*_*vid 49
此错误通常表示目标计算机正在运行,但您尝试连接的服务不可用.(它停止,崩溃或忙于另一个请求.)
英文:已建立与机器(服务运行的远程主机/服务器/ PC)的连接,但由于该机器上的服务不可用,因此机器不知道如何处理该请求.
如果与机器的连接不可用,您将看到不同的错误.我忘记了它是什么,但它是"服务无法访问"或"不可用".
编辑 - 添加
这可能是由防火墙阻塞端口引起的,但鉴于你说它是间歇性的("有时当客户端试图连接"时),这是不太可能的.我原本没有把它包括在内,因为我在回复之前已经在精神上排除了它.
Hug*_*rio 27
我的具体情况是Azure应用服务将最小TLS版本更改为1.2
我不知道从现在开始这是否是默认值,但将其更改回1.0会使其正常工作.
您可以访问"SSL设置"中的设置.
Ste*_*veC 15
不确定这些博客文章中的哪些修复程序有帮助,但其中一个为我排序了这个问题...
帮助我的技巧是使用WebRequest退出并使用HttpWebRequest代替.HttpWebRequest允许我玩3个重要设置:
和
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握手失败.结束了服务器上的密码套件需要更新.
这解决了我的问题。我在发出请求之前添加了这一行:
System.Net.ServicePointManager.Expect100Continue = false;
Run Code Online (Sandbox Code Playgroud)
似乎服务器中存在不支持 100 连续行为的代理。
这对间歇性问题无济于事,但可能对遇到类似问题的其他人有用。
我克隆了一个虚拟机,并使用新的 IP 地址在不同的网络上启动它,但没有更改 IIS 中的绑定。Fiddler 向我显示“无法从传输连接读取数据:现有连接被远程主机强行关闭”,而 IE 则告诉我“在高级设置中打开 TLS 1.0、TLS 1.1 和 TLS 1.2”。将绑定更改为新 IP 地址为我解决了这个问题。
对于那些以后可能会发现的人,在 .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)
较新的框架通过使用可用的最佳协议并阻止不安全或过时的协议来解决这个问题。如果您尝试连接或调用的远程服务出现此错误,则可能是它们不再支持旧协议。
归档时间: |
|
查看次数: |
296620 次 |
最近记录: |