在1月17日09:32,我们的一个服务突然开始抛出500个错误。它是一个适用于第三方服务的适配器服务,我们使用HttpClient对其进行POST(因此,我们使用查询字符串参数对我们的服务进行GET,然后使用POST和参数传递给第三方应用程序身体)。当我用postman或curl手动发布到第三方服务时,它的响应很好。所以这是我们服务的问题。它是使用OWIN中间件的.NET服务,类似于.NET核心的工作方式,我认为。问题是,前一段时间,.NET框架从4.5.2升级到4.6,并且在VS中执行此操作时,它会在web.config中添加一个<httpRuntime targetFramework="4.5.2"/>
元素。这是为了尽最大努力保留应用程序的现有行为,以防在框架版本之间发生任何重大变化。升级的人没有意识到并留在web.config中的元素中。它运行良好很长时间,然后突然在所有环境中同时(包括本地)被捣毁。我认为它在.NET框架中必须与时间相关,但是将我的系统时钟恢复无法修复它!我可以寻找什么,关于这个谜团的任何想法?简单地将web.config修改为4.6可以修复它,但我一直负责调查它。服务突然抛出SocketException,没有明显的变化
这里是底层错误:
System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host
at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
,这是代码,它引发在_client.PostAsync
与上述作为的InnerException。 _client是System.Net.Http.HttpClient
public async Task<CalculateResponse> Calculate(CalculateRequest request)
{
var env = new RequestEnvelope { Body = { RblsCalculate = request } };
request.LoginId = _username;
request.Password = _password;
var body = XmlConvert.SerializeObject(env);
var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
var httpResponse = await _client.PostAsync(_endpointPath, content);
var response = XmlConvert.ToObject<ResponseEnvelope>(await httpResponse.Content.ReadAsStreamAsync());
return response?.Body?.RblsCalculateResponse;
}
第三方没有做任何改动,Windows更新没有运行(这同时完成5个不同的环境)。我们没有做任何改变。部署时,我们每次都部署一个新实例,web.config在服务器上没有更改,之前的部署是在几周前完成的。
我已经检查了4.6的一些变化,如果不使用TLSv1.0 +作为协议,有一些潜在的HttpClient
变更可能发生的变化,我在一台服务器上使用Wireshark进行了检查,我们使用的是TLSv1.2 。但这并不能解释为什么突然停止。
更新 - 输出从trace.log中为SSL/TLS跟踪按@Trumpi建议
System.Net.Sockets Verbose: 0 : [16292] Data from Socket#52088480::PostCompletion
System.Net.Sockets Verbose: 0 : [16292] 00000000 : 16 03 01 00 88 01 00 00-84 03 01 58 A4 49 35 01 : ...........X.I5.
更新2 - 删除了不必要的日志^^
_“当我发布到第三方服务使用邮递员或卷曲手动,它精细的反应。因此,它与我们的服务有问题[...]第三方没有做任何更改” _ - 不同的是执行请求的时间。也许第三方服务目前超载,升级过程中或其他任何情况。如果运行.NET 4.5.2会一直出现此错误,而.NET 4.6则不会,那么请检查两者之间HTTP标头的差异。 – CodeCaster
“由远程主机强制关闭”正在从错误的端口调试问题。不要猜测为什么另一端决定放弃。按照电线。 –
@HansPassant套接字的另一端是我无法访问的第三方应用程序。我确实联系了他们的支持团队,他们说他们看不到任何要求。 – Rodders