Le 17 janvier 09:32, un de nos services a soudainement lancé 500 erreurs. C'est un service d'adaptateur à un service tiers et nous utilisons un HttpClient pour faire un POST (Nous faisons un GET à notre service avec des paramètres de chaîne de requête et nous transférons cela à l'application tierce en utilisant un POST et des paramètres dans le corps). Quand je poste manuellement au service de tiers en utilisant un postier ou une boucle, il a bien répondu. Donc c'était un problème avec notre service. C'est le service .NET qui utilise le middleware OWIN, semblable à la façon dont je travaille. Le problème était qu'il y a quelque temps, le framework .NET a été mis à niveau de 4.5.2 à 4.6 et quand il le fait en VS, il ajoute un élément <httpRuntime targetFramework="4.5.2"/>
au web.config. Il s'agit de faire un effort pour préserver le comportement existant de l'application au cas où il y aurait des changements de rupture entre les versions du framework. La personne qui a mis à jour n'a pas réalisé et laissé dans l'élément dans le web.config. Il a bien fonctionné pendant des siècles, puis soudainement dans tous les environnements en même temps (y compris localement) s'est brisé. Je pensais que ça devait être quelque chose de temporel dans le framework .NET mais rouler l'horloge de mon système ne le résout pas! Que puis-je rechercher, des idées sur ce mystère? Il suffit de faire passer le web.config à 4.6 pour le corriger, mais j'ai été chargé de l'étudier.Le service lance soudainement SocketException sans modifications apparentes
Voici l'erreur sous-jacente:
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)
et c'est le code, il jette à _client.PostAsync
avec ce qui précède que le InnerException. _client est un 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;
}
Le tiers n'a pas fait de changements, des mises à jour de Windows n'a pas couru (cela effectué simultanément 5 environnements différents). Nous n'avons fait aucun changement. Lorsque nous déployons, nous déployons à une nouvelle instance à chaque fois, le web.config n'a pas changé sur les serveurs et le déploiement précédent était des semaines auparavant.
J'ai passé en revue certaines des modifications à 4.6 et il y a quelques changements potentiellement cassants autour de HttpClient
si n'utilisant pas TLSv1.0 + comme protocole, j'ai vérifié using Wireshark sur un des serveurs et nous employons TLSv1.2 . Mais cela n'explique pas pourquoi il s'est soudainement arrêté.
Mise à jour - Sortie de trace.log pour le traçage SSL/TLS selon la suggestion @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.
Mise à jour 2 - Suppression des journaux inutiles ^^
_ « Quand je poste au service tiers manuellement à l'aide ou postier boucle, il a répondu très bien. Il avait un problème avec notre service [...] Le tiers n'a apporté aucune modification » _ - La chose qui diffère est le moment où la demande a été exécutée. Peut-être que le service de tiers était surchargé en ce moment, dans un processus de mise à niveau ou autre. Si l'exécution de .NET 4.5.2 donne systématiquement cette erreur et pas de .NET 4.6, alors allez inspecter les différences entre les en-têtes HTTP entre les deux. – CodeCaster
"fermé de force par l'hôte distant" est le débogage du problème de la mauvaise extrémité de la socket. Ne laisse pas deviner pourquoi l'autre extrémité a décidé d'abandonner. Suivez le fil. –
@HansPassant l'autre extrémité de la socket est une application tierce dont je n'ai pas accès. J'ai contacté leur équipe de support et ils m'ont dit qu'ils ne voyaient aucune demande arriver. – Rodders