如果我错过了本文中的任何细节,我深表歉意,这有点令人困惑,并且似乎比其他任何东西更多的是操作系统中的错误。
我们有一个运行在Windows Server 2019上的ASP.NET Web应用程序。该应用程序尝试与另一个托管应用程序建立Web连接。我们正试图强制其使用TLS1.2。当我们这样做时,重新启动IIS后,初始连接请求始终会失败,然后从那时开始可以正常工作。
我已经安装了Wireshark,可以确认在电线上没有进行任何TCP连接尝试。相反,我们从应用程序中收到一个错误,指出该连接被强制关闭。
System.IO.IOException:无法从传输读取数据 连接:远程强行关闭了现有连接 主办。 ---> System.Net.Sockets.SocketException:现有连接 被远程主机强行关闭 System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量, Int32大小)
ASP.NET应用程序正在使用.NET 4.5.2。简化的代码如下所示:
try {
HttpWebRequest hwrequest = (HttpWebRequest) System.Net.WebRequest.Create("https://api.domain.com/");
hwrequest.Accept = "*/*";
hwrequest.AllowAutoRedirect = true;
hwrequest.UserAgent = "http_requester/0.1";
hwrequest.Timeout = 900000;
hwrequest.Method = "POST";
hwrequest.KeepAlive = false;
hwrequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate {
return true;
});
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] postByteArray = encoding.GetBytes(postData);
hwrequest.ContentLength = postByteArray.Length;
System.IO.Stream postStream = hwrequest.GetRequestStream();
postStream.Write(postByteArray, 0, postByteArray.Length);
postStream.Close();
System.Net.HttpWebResponse hwresponse = (System.Net.HttpWebResponse) hwrequest.GetResponse();
if (hwresponse.StatusCode == System.Net.HttpStatusCode.OK) {
System.IO.Stream responseStream = hwresponse.GetResponseStream();
System.IO.StreamReader myStreamReader = new System.IO.StreamReader(responseStream);
responseData = myStreamReader.ReadToEnd();
}
hwresponse.Close();
}
catch(Exception e) {
Console.WriteLine(e.ToString());
responseData = "An error occurred: " + e.Message;
}
如果刷新页面,则连接尝试成功。但是初始请求失败。 如果我们将行ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
注释掉,则没有问题,但是应用程序使用TLSv1。
您是否可以想到的事情会导致初始连接尝试失败,然后所有后续请求都起作用,直到IIS重新启动为止?似乎是操作系统中的某种错误,而不是编码问题。
这是一个完全修补的Windows Server 2019,几乎在Amazon AWS上都是全新的。没有安装安全软件或其他东西。
答案 0 :(得分:0)
通常这可能意味着远程端关闭了连接(通常通过发送TCP / IP RST数据包)。如果您使用的是第三方应用程序,则可能的原因是:
您正在将格式错误的数据发送到应用程序
客户端和服务器之间的网络链接断开了一些 原因
您已触发第三方应用程序中的错误,导致 它崩溃了
第三方应用程序耗尽了系统资源
可能是第一种情况。
但是您可以启动Wireshark,以准确查看线路上正在发生的事情,以缩小问题的范围。没有更多具体信息,这里的任何人都不可能真正为您提供帮助。
另一种方法是使用TLS 1.2可能会解决此错误。
您可以使用TLS 1.2强制您的应用程序使用(确保在调用服务之前执行它):
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
另一种解决方案:
在本地计算机或服务器中启用强加密以使用TLS1.2,因为默认情况下它被禁用,因此仅使用TLS1.0。 要启用强加密,请在PowerShell中以管理员权限执行以下命令: