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

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

在这里输入图像说明

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

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

tcpClient = (TcpClient)client; clientStream = tcpClient.GetStream(); sr = new StreamReader(clientStream); sw = new StreamWriter(clientStream); // line 96: a = sr.ReadLine(); 

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

这个错误通常意味着目标机器正在运行,但是您尝试连接的服务不可用。 (要么停止,崩溃,要么忙于另一个请求。)

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

如果与机器的连接不可用,则会看到不同的错误。 我忘了它是什么,但它是“服务无法到达”或“不可用”的行。

编辑 – 添加

这可能是由防火墙阻塞端口引起的,但是由于您认为这是间歇性的(“有时候客户端尝试连接”),这是不太可能的。 我原来并没有包括这个,因为我在回答之前已经在精神上排除了这一点。

调用Web服务时收到此错误。 这个问题也与运输层面的安全有关。 我可以通过一个网站项目调用Web服务,但是当在一个testing项目中重复使用相同的代码时,我会得到一个包含这个消息的WebException。 在进行呼叫之前添加以下行解决问题:

 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

从我们的一台服务器调用HTTPS服务时,也抛出“ 无法从传输连接读取数据:现有连接被强制closures ”exception。 HTTP服务,但是,工作正常。 使用Wireshark来查看它是一个TLS握手失败。 结果是服务器上的密码套件需要更新。

出于某种原因,连接到服务器丢失。 可能是服务器明确closures了连接,或者是服务器上的一个错误导致了意外closures。 或者客户端和服务器(交换机或路由器)之间的连接断开了。

这可能是导致问题的服务器代码,可能不是。 如果您有权访问服务器代码,那么可以在那里进行一些debugging,告诉您客户端连接何时closures。 这可能会告诉你什么时候以及为什么连接被丢弃。

在客户端上,您必须编写代码,以便随时考虑服务器发生故障的可能性。 这就是它的方式:networking连接本质上是不可靠的。

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

我克隆了一个虚拟机,并在不同的networking上启动了一个新的IP地址,但没有改变IIS中的绑定。 提琴手向我展示“无法从传输连接读取数据:现有的连接被远程主机强行closures”,IE告诉我“在高级设置中打开TLS 1.0,TLS 1.1和TLS 1.2”。 改变绑定到新的IP地址解决了我。

我过去遇到这个问题 我正在使用PostgreSQL ,当我运行我的程序,有时它连接,有时它会引发这样的错误。

当我使用我的代码进行实验时,我将Connection代码放在​​公共表单下面的第一行。 这里是一个例子:

之前:

  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()); } 

现在:

  public Form1() { //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()); //HERE LIES SOME CODES FOR RESIZING MY CONTROLS DURING RUNTIME //CODE //CODE AGAIN //ANOTHER CODE //CODE NA NAMAN //CODE PA RIN! } 

我认为程序在做任何事情之前必须首先读取连接,我不知道,如果我错了,纠正我。 但根据我的研究,这不是一个代码问题 – 它实际上来自机器本身。

快乐编码!

我有一个第三方应用程序(Fiddler)运行,试图看到正在发送的请求。 closures这个应用程序修复了我