C# 无法从传输连接读取数据:远程主机强制关闭了现有连接
我有一个服务器应用程序,当客户端尝试连接时,有时会出现以下错误: 注意:“无法从客户端获取流或登录失败”是我在catch语句中添加的文本 它停止的行(sThread:line 96)是:C# 无法从传输连接读取数据:远程主机强制关闭了现有连接,c#,.net,ioexception,C#,.net,Ioexception,我有一个服务器应用程序,当客户端尝试连接时,有时会出现以下错误: 注意:“无法从客户端获取流或登录失败”是我在catch语句中添加的文本 它停止的行(sThread:line 96)是: 是什么导致了这个问题?请注意,此错误并非总是发生此错误通常表示目标计算机正在运行,但您尝试连接的服务不可用。(它停止、崩溃或正忙于另一个请求。) 英文: 已建立与计算机(服务运行所在的远程主机/服务器/PC)的连接,但由于该计算机上的服务不可用,因此该计算机不知道如何处理该请求 如果与机器的连接不可用,您将看
是什么导致了这个问题?请注意,此错误并非总是发生此错误通常表示目标计算机正在运行,但您尝试连接的服务不可用。(它停止、崩溃或正忙于另一个请求。) 英文: 已建立与计算机(服务运行所在的远程主机/服务器/PC)的连接,但由于该计算机上的服务不可用,因此该计算机不知道如何处理该请求 如果与机器的连接不可用,您将看到另一个错误。我忘了它是什么,但它的意思是“无法获得服务”或“不可用” 编辑-添加
这可能是由于防火墙阻塞了端口造成的,但如果您说这是间歇性的(“有时当客户端尝试连接时”),那就不太可能了。我最初没有包括这一点,因为我在回答之前在心里排除了它。由于某种原因,与服务器的连接丢失。可能是服务器显式关闭了连接,或者是服务器上的错误导致连接意外关闭。或者客户端和服务器(交换机或路由器)之间的某个东西断开了连接 可能是服务器代码导致了问题,也可能不是。如果您有权访问服务器代码,则可以在其中放置一些调试,以在客户端连接关闭时通知您。这可能会给您一些关于何时以及为什么断开连接的指示
在客户机上,您必须编写代码,以考虑服务器随时发生故障的可能性。事实就是这样:网络连接天生就不可靠。不确定这些博客文章中的哪些修复有帮助,但其中一个为我解决了这个问题 帮助我的诀窍是停止使用WebRequest,改用HttpWebRequest。HttpWebRequest允许我使用3个重要设置: 及
- 步骤1:禁用KeepAlive
- 步骤2:将ProtocolVersion设置为Version10
- 步骤3:限制服务点的数量
我克隆了一个虚拟机,并用新的IP地址在另一个网络上启动它,但没有更改IIS中的绑定。Fiddler告诉我“无法从传输连接读取数据:远程主机强制关闭了现有连接”,IE告诉我“在高级设置中打开TLS 1.0、TLS 1.1和TLS 1.2”。将绑定更改为新的IP地址为我解决了这个问题。我在调用web服务时收到了这个错误。这一问题还与运输层面的安全有关。我可以通过网站项目调用web服务,但是在测试项目中重用相同的代码时,我会得到一个包含此消息的WebException。在拨打电话之前添加以下行解决了问题:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
编辑
-该物业
选择安全套接字层(SSL)或传输的版本
层安全性(TLS)协议,用于使用
仅限安全超文本传输协议(HTTPS)方案;现有的
连接没有改变
我认为在选择协议版本时,在TLS握手过程中,SecurityProtocol
配置非常重要
-该协议用于交换双方所需的所有信息,以通过TLS交换实际应用数据
ClientHello-客户端发送ClientHello消息,指定其支持的最高TLS协议版本
ServerHello-服务器以ServerHello消息响应,其中包含所选的协议版本。。。所选的协议版本应该是客户端和服务器都支持的最高版本。例如,如果客户端支持TLS版本1.1,服务器支持版本1.2,则应选择版本1.1;不应选择版本1.2
我以前也遇到过这个问题。我使用的是PostgreSQL,当我运行我的程序时,它有时会连接,有时会抛出这样的错误 当我尝试我的代码时,我把我的连接代码放在公共表单下面的第一行。以下是一个例子: 之前:
public Form1()
{
//HERE LIES SOME CODES FOR RESIZING MY CONTROLS DURING RUNTIME
//CODE
//CODE AGAIN
//ANOTHER CODE
//CODE NA NAMAN
//CODE PA RIN!
//Connect to Database to generate auto number
NpgsqlConnection iConnect = new NpgsqlConnection("Server=localhost;Port=5432;User ID=postgres;Password=pass;Database=DB");
iConnect.Open();
NpgsqlCommand iQuery = new NpgsqlCommand("Select * from table1", iConnect);
NpgsqlDataReader iRead = iQuery.ExecuteReader();
NpgsqlDataAdapter iAdapter = new NpgsqlDataAdapter(iQuery);
DataSet iDataSet = new DataSet();
iAdapter.Fill(iDataSet, "ID");
MessageBox.Show(iDataSet.Tables["ID"].Rows.Count.ToString());
}
现在:
我认为程序在做任何事情之前必须先阅读连接,我不知道,如果我错了,请纠正我。但根据我的研究,这不是一个代码问题——它实际上来自机器本身
快乐编码 这解决了我的问题。在提出请求之前,我添加了这一行:
System.Net.ServicePointManager.Expect100Continue = false;
服务器中似乎存在一个不支持100 continue行为的代理
System.Net.ServicePointManager.Expect100Continue = false;
由于在web服务器上实现代理服务器,有时会出现此问题。要绕过代理服务器,请在调用发送服务器之前放置此行
System.Net.ServicePointManager.Expect100Continue = false;
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.0\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.0\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.1\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.1\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.2\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.2\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001
If that doesn't do it, you could also experiment with adding the entry for SSL 2.0:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
services.AddScoped(provider => new CfDbContext(builder.Options));
services.AddScoped(provider => provider.GetService<CfDbContext>());
services.AddScoped(provider => new CfDbContext(builder.Options));
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
clr.AddReference("System.Net")
from System.Net import ServicePointManager, SecurityProtocolType
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls
<compilation debug="true" targetFramework="4.5">
...
<httpRuntime targetFramework="4.5" />
<compilation debug="true" targetFramework="4.7.2">
...
<httpRuntime targetFramework="4.7.2" />