377 votes

Aucune connexion n'a pu être établie car la machine cible l'a activement refusée ?

Parfois, je reçois l'erreur suivante alors que je fais une requête HttpWeb à un service Web. J'ai également copié mon code ci-dessous.


System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 127.0.0.1:80
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.GetRequestStream()

ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
HttpWebRequest request = (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);

    using (StreamWriter reqWriter = new StreamWriter(request.GetRequestStream()))
    {                        
        while (true)
        {
            int index01 = parList.Length;
            int index02 = parList.IndexOf("=");

            if (parList.IndexOf("&") > 0)
                index01 = parList.IndexOf("&");

            string parName = parList.Substring(0, index02);
            string parValue = parList.Substring(index02 + 1, index01 - index02 - 1);

            reqWriter.Write("{0}={1}", HttpUtility.UrlEncode(parName), HttpUtility.UrlEncode(parValue));

             if (index01 == parList.Length)
                 break;

             reqWriter.Write("&");
             parList = parList.Substring(index01 + 1);
         }
     }
 }
 else
 {
     request.ContentLength = 0;
 }

 response = (HttpWebResponse)request.GetResponse();

3 votes

Je viens de rencontrer ce problème en me connectant à Azure. Il est assez sûr de dire que la machine cible est disponible. Le problème a persisté après le redémarrage et la réinitialisation du routeur. Bizarre. Le problème ? Fiddler ne s'est pas arrêté correctement. Le système s'attendait toujours à acheminer le trafic par Fiddler et c'est la "machine cible" qui était indisponible.

0 votes

Cela pourrait-il avoir un rapport avec les prises utilisées ? Les fermez-vous à la sortie ?

270voto

Will Points 30630

Si cela se produit toujours, cela signifie littéralement que la machine existe mais qu'elle n'a pas de services écoutant sur le port spécifié, ou qu'un pare-feu vous en empêche.

Si cela se produit occasionnellement - vous avez utilisé le mot "parfois" - et que la nouvelle tentative réussit, c'est probablement parce que le serveur a un "arriéré" complet.

Quand vous attendez d'être accept ed sur un socket en écoute, vous êtes placé dans un backlog. Cette file d'attente est finie et assez courte - des valeurs de 1, 2 ou 3 ne sont pas inhabituelles - et le système d'exploitation peut donc ne pas être en mesure de mettre en file d'attente votre demande d'acceptation pour la consommer.

L'arriéré est un paramètre de l listen Tous les langages et toutes les plates-formes ont fondamentalement la même API à cet égard, même la fonction C# un . Ce paramètre est souvent configurable si vous contrôlez le serveur, et il est probablement lu depuis un fichier de paramètres ou le registre. Cherchez à savoir comment configurer votre serveur.

Si vous avez écrit le serveur, vous pouvez avoir un traitement lourd dans l'acceptation de votre socket, et il est préférable de le déplacer vers un worker-thread séparé afin que votre acceptation soit toujours prête à recevoir des connexions. Il existe plusieurs choix d'architecture que vous pouvez explorer pour limiter la mise en file d'attente des clients et leur traitement séquentiel.

Peu importe de savoir si vous pouvez augmenter l'arriéré des serveurs, vous devez réessayer dans votre code client pour faire face à ce problème - car même avec un long arriéré, le serveur peut recevoir beaucoup d'autres demandes sur ce port à ce moment-là.

Il existe une rare possibilité qu'un routeur NAT donne cette erreur si ses ports de mappage sont épuisés. Je pense que nous pouvons écarter cette possibilité, car le routeur peut établir 64 000 connexions simultanées à la même adresse/au même port de destination avant l'épuisement.

0 votes

Oui, je l'obtiens occasionnellement, pas toujours, je ne pense pas que la raison soit le pare-feu ou autre, mais l'arriéré peut être la raison de ce problème. Y a-t-il un moyen de résoudre ce problème ?

0 votes

@hsnkvk ; la manière robuste appropriée est que le client ait une boucle de réessai ; réponse mise à jour en conséquence.

0 votes

@Will ; J'ai déjà un iterationCount et je réessaye iterationCount fois si ça échoue :(

49voto

La raison la plus probable est un pare-feu.

Cet article contient un ensemble de raisons. Il peut vous être utile.

D'après l'article, les raisons possibles pourraient être :

  • Paramètres du serveur FTP
  • Paramètres du logiciel/pare-feu personnel
  • Pare-feux logiciels/personnels multiples
  • Logiciel anti-virus
  • Couche LSP
  • Firmware du routeur

16 votes

Je sais que c'est vieux, mais vous pourriez ajouter Fiddler à cette liste. En détachant Fiddler pendant le démarrage de l'application, puis en le rattachant, mes sockets fonctionnent correctement.

1 votes

Le pouce en haut pour Fiddler

5 votes

J'avais installé fiddler sur la machine de développement et cela a causé ce problème, je n'avais pas fiddler ouvert lors de l'exécution de ce projet spécifique et j'ai eu l'erreur. Lorsque j'ai ouvert fiddler tout en exécutant le projet, cela a fonctionné.

22voto

Mr_Green Points 8867

Cela m'est arrivé aussi Parfois, lorsque j'ouvre mon projet, cette erreur s'affiche, ce qui est frustrant. Le problème était que parfois le numéro de port du service web changeait de façon inattendue.

Ce problème se produit généralement lorsque vous avez plus d'une copie du projet.

Mon projet appelait le service Web avec un numéro de port spécifique que j'ai assigné dans le fichier Web.Config de mon fichier de projet principal. Comme le numéro de port a changé de façon inattendue, le navigateur n'a pas pu trouver le service Web et a lancé cette erreur.

J'ai résolu ce problème en suivant les étapes suivantes : (Visual Studio 2010)

Allez dans les propriétés du Web service projet --> cliquez sur Web onglet --> Dans Serveurs section --> Vérifier Port spécifique et ensuite assigner le standard port number par lequel votre projet principal appelle le service web.

J'espère que cela résoudra le problème.

Santé :)

3 votes

Ce n'était pas une connaissance commune pour moi. J'ai été très confus quant à la raison de mon erreur. LocalHost:2532 pour moi. Il s'avère qu'il a été réglé de cette façon par le propriétaire précédent dans la zone que vous avez spécifiée. Maintenant que ce mystère est éclairci, ça rend d'autres choses moins mystérieuses. Merci !

4voto

Ravichandra Points 21

J'ai eu le même problème. Le problème est que je n'arrive pas à démarrer le serveur Selenium. J'ai téléchargé le serveur Selenium et je l'ai démarré. Après le démarrage du serveur Selenium, le problème a disparu et tout a fonctionné correctement.

Référez-vous à ce : http://coding-issues.blogspot.in/2012/11/no-connection-could-be-made-because.html

2 votes

La question ne mentionnait rien à propos du serveur Selenium.

1 votes

@GeoffDawdy C'est juste un autre exemple de la raison n°1 de Réponse de Will - favorise l'apprentissage par la répétition ;-)

3voto

John Zabroski Points 372

J'ai obtenu cette erreur dans une application qui utilise AppFabric. L'indice était l'obtention d'une DataCacheException [1] dans la trace de la pile. Pour voir si c'est le problème que vous rencontrez, exécutez la commande PowerShell suivante :

@("AppFabricCachingService", "RemoteRegistry") | % { get-service $_ }

Si l'un de ces deux services est arrêté, vous obtiendrez cette erreur.

[1] http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacacheexception.aspx

0 votes

Merci. À titre d'information, pour ma gouverne et celle des autres, je précise que est apparu pour fonctionner quand j'ai démarré le service mais l'application avait toutes sortes de lenteurs et j'ai finalement compris (d'uh) que le service sur l'autre serveur dans le cluster AppFabric n'était pas activé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X