Error: "System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host" on test server
Error: "System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host" on test server
我遇到一个问题,我的 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 地址。它的格式正确。
任何建议都会有所帮助。
如果您在 BeginGetResponse()
和 EndGetResponse()
之间遇到此错误,则有以下几种可能性:
Begin
和 End
之间的时间过长,服务器超时。这可以通过额外的日志记录来检查。
- 服务器对您发送的内容不满意并关闭了连接。这不是这里的问题,因为您在另一台机器上成功地测试了它。
- 如果 URL 是 HTTPS URL,则此错误可能是由 TLS 协商期间的问题引起的。建立 TCP 连接时,客户端和服务器无法就连接的 TLS 参数达成一致,并且一方在您的请求发送之前关闭了连接。
检查 TLS 问题的最佳方法是登录到测试服务器并尝试在 Web 浏览器(例如 Google Chrome 或 Internet Explorer 中访问 URL .您不能在此处使用 FireFox 进行测试,因为 FireFox 使用它自己的 TLS 实现,因此在 Chrome、IE 和 .NET 无法成功的情况下可能会成功。
如果您无法使用浏览器导航到该站点,则很可能是:
- 客户端不信任服务器发送的证书。通常这很容易使用 Web 浏览器检测到,并且可以通过让服务器使用公开签名的证书或验证并决定信任服务器使用的根证书来解决。这也可能是服务器配置错误,没有发送中间证书。
- 测试系统和服务器不支持相同的TLS/SSL版本。 TLS v1.2 是唯一被 ia 认为安全的 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 连接。您必须联系服务器的支持部门并让他们调查这个问题。
希望对您有所帮助
我遇到一个问题,我的 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 地址。它的格式正确。 任何建议都会有所帮助。
如果您在 BeginGetResponse()
和 EndGetResponse()
之间遇到此错误,则有以下几种可能性:
Begin
和End
之间的时间过长,服务器超时。这可以通过额外的日志记录来检查。- 服务器对您发送的内容不满意并关闭了连接。这不是这里的问题,因为您在另一台机器上成功地测试了它。
- 如果 URL 是 HTTPS URL,则此错误可能是由 TLS 协商期间的问题引起的。建立 TCP 连接时,客户端和服务器无法就连接的 TLS 参数达成一致,并且一方在您的请求发送之前关闭了连接。
检查 TLS 问题的最佳方法是登录到测试服务器并尝试在 Web 浏览器(例如 Google Chrome 或 Internet Explorer 中访问 URL .您不能在此处使用 FireFox 进行测试,因为 FireFox 使用它自己的 TLS 实现,因此在 Chrome、IE 和 .NET 无法成功的情况下可能会成功。
如果您无法使用浏览器导航到该站点,则很可能是:
- 客户端不信任服务器发送的证书。通常这很容易使用 Web 浏览器检测到,并且可以通过让服务器使用公开签名的证书或验证并决定信任服务器使用的根证书来解决。这也可能是服务器配置错误,没有发送中间证书。
- 测试系统和服务器不支持相同的TLS/SSL版本。 TLS v1.2 是唯一被 ia 认为安全的 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 连接。您必须联系服务器的支持部门并让他们调查这个问题。
希望对您有所帮助