Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从传输连接读取数据:远程主机强制关闭了现有连接_C#_.net_Ioexception - Fatal编程技术网

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

C# 无法从传输连接读取数据:远程主机强制关闭了现有连接,c#,.net,ioexception,C#,.net,Ioexception,我有一个服务器应用程序,当客户端尝试连接时,有时会出现以下错误: 注意:“无法从客户端获取流或登录失败”是我在catch语句中添加的文本 它停止的行(sThread:line 96)是: 是什么导致了这个问题?请注意,此错误并非总是发生此错误通常表示目标计算机正在运行,但您尝试连接的服务不可用。(它停止、崩溃或正忙于另一个请求。) 英文: 已建立与计算机(服务运行所在的远程主机/服务器/PC)的连接,但由于该计算机上的服务不可用,因此该计算机不知道如何处理该请求 如果与机器的连接不可用,您将看

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

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

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


是什么导致了这个问题?请注意,此错误并非总是发生

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

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

如果与机器的连接不可用,您将看到另一个错误。我忘了它是什么,但它的意思是“无法获得服务”或“不可用”

编辑-添加


这可能是由于防火墙阻塞了端口造成的,但如果您说这是间歇性的(“有时当客户端尝试连接时”),那就不太可能了。我最初没有包括这一点,因为我在回答之前在心里排除了它。

由于某种原因,与服务器的连接丢失。可能是服务器显式关闭了连接,或者是服务器上的错误导致连接意外关闭。或者客户端和服务器(交换机或路由器)之间的某个东西断开了连接

可能是服务器代码导致了问题,也可能不是。如果您有权访问服务器代码,则可以在其中放置一些调试,以在客户端连接关闭时通知您。这可能会给您一些关于何时以及为什么断开连接的指示


在客户机上,您必须编写代码,以考虑服务器随时发生故障的可能性。事实就是这样:网络连接天生就不可靠。

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

帮助我的诀窍是停止使用WebRequest,改用HttpWebRequest。HttpWebRequest允许我使用3个重要设置:

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

我让第三方应用程序(Fiddler)运行,以尝试查看发送的请求。关闭此应用程序为我修复了它

从我们的一台服务器调用HTTPS服务也引发了“无法从传输连接读取数据:现有连接被强制关闭”异常。不过,HTTP服务运行良好。使用Wireshark查看这是TLS握手失败。结果是服务器上的密码套件需要更新

这对间歇性问题没有帮助,但对其他有类似问题的人可能有用


我克隆了一个虚拟机,并用新的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" />