Parfois, lorsque j'exécute HttpWebRequest sur un service Web, l'erreur suivante se produit. J'ai également copié mon code ci-dessous.
System.Net.WebException : impossible de se connecter au serveur distant ---> System.Net.Sockets.SocketException : la connexion n'a pas pu être établie car l'ordinateur cible a activement refusé 127.0.0.1:80 sur System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress) sur System.Net.Sockets.Socket.InternalConnect (EndPoint RemoteEP) à System.Net.ServicePoint.ConnectSocketInternal (Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& adresse, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception) --- Fin de la trace de la pile d'exceptions interne --- sur System.Net.HttpWebRequest.GetRequestStream() ≪/pré> ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy(); Requête HttpWebRequest = (HttpWebRequest)WebRequest.Create(url); request.PreAuthenticate = true; request.Credentials = networkCredential(sla); request.Method = WebRequestMethods.Http.Post; request.ContentType = "application/x-www-form-urlencoded"; request.Timeout = v_Timeout * 1000 ; if (url.IndexOf("asmx") > 0 && parStartIndex > 0) { AppHelper.Logger.Append("#############" + sla.ServiceName); en utilisant (StreamWriter reqWriter = new StreamWriter(request.GetRequestStream())) { tandis que (vrai) { int index01 = parList.Length; int index02 = parList.IndexOf("="); si (parList.IndexOf("&") > 0) index01 = parList.IndexOf("&"); chaîne parName = parList.Substring(0, index02); chaîne parValue = parList.Substring(index02 + 1, index01 - index02 - 1); reqWriter.Write("{0}={1}", HttpUtility.UrlEncode(parName), HttpUtility.UrlEncode(parValue)); si (index01 == parList.Length) casser; reqWriter.Write("&"); parList = parList.Substring(index01 + 1); } } } autre { requête.ContentLength = 0 ; } réponse = (HttpWebResponse)request.GetResponse();
Si cela continue, cela signifie en fait que la machine existe, mais qu'aucun service n'écoute sur le port spécifié ou qu'un pare-feu vous bloque.
Si cela se produit occasionnellement - vous avez utilisé le mot "parfois" - et que la nouvelle tentative réussit, c'est probablement parce que le "backlog" du serveur est plein.
Pendant que vous attendez d'être accepté sur une socket d'écoute, vous serez placé dans un backlog. Ce retard est limité et très court - les valeurs de 1, 2 ou 3 ne sont pas rares - de sorte que le système d'exploitation peut ne pas être en mesure de mettre votre demande en file d'attente pour « accepter » pour la consommation.
backlog est un paramètre de la fonction
listen
- tous les langages et plates-formes ont fondamentalement la même API à cet égard, mêmeC#. Si vous contrôlez le serveur, ce paramètre est généralement configurable et peut être lu à partir d'un fichier de configuration ou d'un registre. Découvrez comment configurer votre serveur.Si vous avez écrit un serveur, vous avez probablement un traitement lourd dans l'acceptation du socket, qui pourrait être mieux déplacé vers un thread de travail séparé, afin que votre acceptation soit toujours prête à recevoir des connexions. Vous pouvez explorer diverses options architecturales pour réduire les files d'attente et le traitement séquentiel côté client.
Quoi qu'il en soit, que vous puissiez ou non augmenter le backlog du serveur, votre code client aura besoin d'uneretrylogique pour gérer cela - car même avec un long backlog, le serveur peut toujours être bloqué à ce moment-là. De nombreuses demandes de d'autres ports sont reçus.
Il existe une rare possibilité que cette erreur se produise si le routeur NAT manque de ports mappés. Je pense que cela est trop improbable, car le routeur peut établir 64 000 connexions simultanées vers la même adresse/port de destination avant de manquer de capacité.