ASP.NET应用程序最初因以下原因而失败:远程主机强行关闭了现有连接

时间:2019-07-18 21:36:40

标签: c# asp.net iis

如果我错过了本文中的任何细节,我深表歉意,这有点令人困惑,并且似乎比其他任何东西更多的是操作系统中的错误。

我们有一个运行在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上都是全新的。没有安装安全软件或其他东西。

1 个答案:

答案 0 :(得分:0)

通常这可能意味着远程端关闭了连接(通常通过发送TCP / IP RST数据包)。如果您使用的是第三方应用程序,则可能的原因是:

  • 您正在将格式错误的数据发送到应用程序

  • 客户端和服务器之间的网络链接断开了一些 原因

  • 您已触发第三方应用程序中的错误,导致 它崩溃了

  • 第三方应用程序耗尽了系统资源

可能是第一种情况。

但是您可以启动Wireshark,以准确查看线路上正在发生的事情,以缩小问题的范围。没有更多具体信息,这里的任何人都不可能真正为您提供帮助。

另一种方法是使用TLS 1.2可能会解决此错误。

您可以使用TLS 1.2强制您的应用程序使用(确保在调用服务之前执行它):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

另一种解决方案:

在本地计算机或服务器中启用强加密以使用TLS1.2,因为默认情况下它被禁用,因此仅使用TLS1.0。 要启用强加密,请在PowerShell中以管理员权限执行以下命令: