无法从传输连接读取数据:现有连接被远程主机强制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这个应用程序修复了我