错误:“System.Net.Sockets.SocketException(0x80004005):测试服务器上的远程主机强行关闭现有连接

时间:2018-02-01 11:09:00

标签: c# asp.net-web-api system.net.sockets

我遇到的问题是我的Web API在本地系统上运行良好,但在服务器上部署时会产生问题。我已经检查过,多次交叉检查,看看我是否错过了配置中的任何内容,但一切都井然有序。 以下是我正在使用的代码。 抛出此错误的行是:using(WebResponse webResponse = webRequest.EndGetResponse(asyncResult))

        public static string PostDataToWebService(string stream, string CustIP)
    {
        var _url = AdditionalSetting.AutoEuroURL;
        string soapResult = string.Empty;
        try
        {
            XmlDocument soapEnvelopeXml = CreateSoapEnvelope(stream);
            HttpWebRequest webRequest = CreateWebRequest(_url, CustIP);
            InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
            IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
            asyncResult.AsyncWaitHandle.WaitOne();
            using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
            {
                using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
                {
                    soapResult = rd.ReadToEnd();
                }
            }
        }
        catch (WebException wbex)
        {
            using (var ResStream = wbex.Response.GetResponseStream())
            using (var reader = new StreamReader(ResStream))
            {
                ErrorLog.ErrorLogs("WebException at AutoEurope Call web service : " + reader.ReadToEnd());
            }
        }
        return soapResult;
    }


    private static XmlDocument CreateSoapEnvelope(string stream)
    {

        XmlDocument soapEnvelop = new XmlDocument();
        try
        {
            soapEnvelop.LoadXml(stream);
        }
        catch (Exception ex)
        {

        }
        return soapEnvelop;
    }

    private static HttpWebRequest CreateWebRequest(string url, string CustIP)
    {
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
        webRequest.Headers.Add("SOAPAction", "OTA");
        webRequest.Headers.Add("X-Forwarded-For", "\"" + CustIP + "\"");
        webRequest.ContentType = "text/xml;charset=\"utf-8\"";
        webRequest.Accept = "text/xml";
        webRequest.Method = "POST";
        webRequest.KeepAlive = false;
        webRequest.ProtocolVersion = HttpVersion.Version10;
        return webRequest;
    }

    private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
    {
        using (Stream stream = webRequest.GetRequestStream())
        {
            soapEnvelopeXml.Save(stream);
        }
    }

我收到的CustIP是我在方法中作为参数获取的请求IP地址。它的格式正确。 任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

如果您在BeginGetResponse()EndGetResponse()之间收到此错误,则有以下几种可能:

  • 很多时间在BeginEnd之间传递,服务器超时。这可以通过额外的记录来检查。
  • 服务器对您发送的内容不满意并关闭了连接。当你从另一台机器上成功测试时,这不是问题所在。
  • 如果URL是HTTPS URL,则此错误可能是由TLS协商期间的问题引起的。建立TCP连接时,客户端和服务器无法就连接的TLS参数达成一致,并且在请求发送之前,一方关闭了连接。

检查TLS问题的最佳方法是登录测试服务器并尝试访问网络浏览器(如Google Chrome或Internet Explorer)中的网址。你不能在这里使用FireFox进行测试,因为FireFox使用它自己的TLS实现,所以可能能够在Chrome,IE和.NET无法成功的地方取得成功。

如果您无法使用浏览器导航到该网站,则很可能是:

  • 客户端不信任服务器发送的证书。通常,这很容易使用Web浏览器进行检测,可以通过让服务器使用公共签名证书,或者验证并决定信任服务器使用的根证书来解决。这也可能是服务器配置错误而且没有发送中间证书。
  • 测试系统和服务器不支持相同的TLS / SSL版本。 TLS v1.2是唯一被认为是安全的TLS版本,许多系统被锁定(通过注册表)以禁用TLS v1.1,v1.0和SSL v3和v2。
  • 这两个系统不支持相同的密码套件。同样,这可能是因为系统配置不允许使用这些密码,或者系统根本不支持这些密码。

如果您可以选择安装WireShark并了解TLS握手,那么这可能是确定系统无法通信的最快方式,因为您可以直接看到问题并消除大量猜测

通常,诸如此类的问题是因为客户端或服务器正在使用过时的操作系统。 Windows 95客户端不太可能连接到在最新版本的OpenSUSE上运行的HTTPS网站,因为它们太不同了。具体而言,Windows 95不太可能支持除了SSLv3之外的其他任何基本密码套件(如RC4),这些套件在最近的OpenSUSE上都不会得到支持,因为它们现在被认为是不安全的。甚至Windows Server 2003也太旧了,无法支持TLS v1.1或v1.2。检查操作系统的版本,WireShark将再次强调这一点。

<强>更新

如果您无法连接到该服务并且该服务已公开,您可以使用https://www.ssllabs.com/ssltest/上的在线SSL测试程序验证服务器是否正确响应。

在这种情况下(使用您在注释中提供的地址),问题是服务器没有正确响应任何连接,甚至是到端口80的不安全的HTTP连接。您必须联系服务器&#39; s支持部门,让他们调查问题。

希望这有帮助