Non è stato possibile stabilire alcuna connessione perché la macchina target l'ha rifiutata attivamente?


260

A volte ricevo il seguente errore mentre stavo facendo HttpWebRequest a un WebService. Ho copiato anche il mio codice qui sotto.


System.Net.WebException: impossibile connettersi al server remoto ---> System.Net.Sockets.SocketException: Impossibile stabilire una connessione perché la macchina di destinazione l'ha rifiutata attivamente 127.0.0.1:80
   su System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress)
   su System.Net.Sockets.Socket.InternalConnect (EndPoint remoteEP)
   su System.Net.ServicePoint.ConnectSocketInternal (connectFailure booleano, Socket s4, Socket s6, Socket e socket, indirizzo e indirizzo IP, stato ConnectSocketState, IAsyncResult asyncResult, Timeout Int32, Eccezione ed eccezione)
   --- Fine della traccia dello stack delle eccezioni interne ---
   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();

1
Mi sono appena imbattuto in questo collegamento ad Azure. È abbastanza sicuro dire che la macchina target è disponibile. Il problema persiste dopo il riavvio e il ripristino del router. Strano. Problema? Fiddler non si era chiuso correttamente. Il sistema si aspettava ancora di instradare il traffico attraverso Fiddler e questa è la "macchina target" che non era disponibile.
Vok,

Questo potrebbe avere qualcosa a che fare con le prese utilizzate? Li chiudi all'uscita?
George Sp,

Risposte:


204

Se ciò accade sempre, significa letteralmente che la macchina esiste ma che non ha servizi in ascolto sulla porta specificata o che c'è un firewall che ti blocca.

Se succede di tanto in tanto - hai usato la parola "a volte" - e il tentativo ha esito positivo, è probabile che il server abbia un 'backlog' completo.

Quando stai aspettando di essere accepteditato su un socket di ascolto, ti trovi in ​​un backlog. Questo backlog è limitato e piuttosto breve - i valori di 1, 2 o 3 non sono inusuali - e quindi il sistema operativo potrebbe non essere in grado di mettere in coda la richiesta per il consumo di "accetta".

Il backlog è un parametro della listenfunzione: tutte le lingue e le piattaforme hanno sostanzialmente la stessa API in questo senso, anche quella C # . Questo parametro è spesso configurabile se si controlla il server ed è probabilmente letto da alcuni file delle impostazioni o dal registro. Scopri come configurare il tuo server.

Se hai scritto il server, potresti avere un'elaborazione pesante nell'accettare il tuo socket, e questo può essere spostato meglio in un thread di lavoro separato in modo che il tuo Accept sia sempre pronto a ricevere connessioni. Esistono varie opzioni di architettura che è possibile esplorare che mitigano l'accodamento dei client e l'elaborazione in sequenza.

Indipendentemente dal fatto che sia possibile aumentare il backlog del server, è necessario riprovare la logica nel codice client per far fronte a questo problema - poiché anche con un backlog lungo il server potrebbe ricevere molte altre richieste su quella porta in quel momento.

Esiste una rara possibilità in cui un router NAT darebbe questo errore se le sue porte per i mapping fossero esaurite. Penso che possiamo scartare questa possibilità come un tiro troppo lungo, poiché il router ha 64K connessioni simultanee allo stesso indirizzo / porta di destinazione prima dell'esaurimento.


Sì, lo capisco di tanto in tanto, non sempre, non credo che la ragione sia il firewall o qualsiasi altra cosa, ma il backlog può essere la ragione di questo problema. Esiste un modo per risolvere questo problema?
hsnkvk,

@hsnkvk; il modo corretto è che il client abbia un ciclo di tentativi; risposta aggiornata di conseguenza
Will

@Volere; Ho già un iterationCount e riprovo iterationCount volte se fallisce. :(
hsnkvk,

1
Questa è la cosa. Progettato / configurato male è piuttosto vago come hai detto. Per controllo del codice, vuoi dire che vuoi visualizzare il codice che chiama il servizio web? Non l'ho pubblicato come lo stesso identico codice di quello che chiama il primo servizio web e che funziona perfettamente. Esiste una proprietà sul server che può essere configurata tramite web.config che potrebbe influire sulla seconda webapp?
Amith George,

9
127.0.0.1:80 suggerisce che il servizio Web si trova sul computer locale, il che rende i problemi di rete poco gradevoli. Ciò che è molto probabile è che il servizio Web sia stato avviato più lentamente dell'applicazione client durante il test. Aggiungere ancora la logica dei tentativi è sicuramente la strada da percorrere.
Martin Brown,

31

Il motivo più probabile è un firewall.

Questo articolo contiene una serie di motivi, che potrebbero esserti utili.

Dall'articolo, le possibili ragioni potrebbero essere:

  • Impostazioni del server FTP
  • Impostazioni software / firewall personali
  • Più software / firewall personali
  • Programma antivirus
  • Strato LSP
  • Firmware del router
  • Computer spento
  • Computer non collegato
  • Violinista

9
So che è vecchio, ma potresti aggiungere Fiddler a questo elenco. staccare il violinista durante l'avvio dell'app, quindi ricollegare i miei socket funzionava correttamente.
ps2goat,

1
Pollice in su per Fiddler
Kalin Krastev

3
Avevo installato il violinista sul computer di sviluppo e questo ha causato questo problema, non avevo il violinista aperto durante l'esecuzione di questo progetto specifico e ho riscontrato l'errore. Quando ho aperto il violinista mentre
eseguivo

16

Questo è successo anche a me .. A volte quando apro il mio progetto viene visualizzato questo errore che è stato frustrante. Il problema era che a volte il numero di porta del servizio Web cambiava inaspettatamente.

Questo problema si verifica in genere quando si dispone di più di una copia del progetto

Il mio progetto stava chiamando il servizio Web con un numero di porta specifico che avevo assegnato nel file Web.Config del mio file di progetto principale. Poiché il numero di porta è cambiato in modo imprevisto, il browser non è stato in grado di trovare il servizio Web e generare tale errore.

Ho risolto questo seguendo i passaggi seguenti: (Visual Studio 2010)

Andare su Proprietà del Web serviceprogetto -> fare clic sulla scheda Web -> Nella sezione Server -> Controlla porta specifica e quindi assegnare il nome standard port numberdal quale il progetto principale chiama il servizio Web.

Spero che questo risolva il problema.

Saluti :)


2
Questa non era una conoscenza comune per me. Sono stato confuso come diamine sul perché il mio errore specificato LocalHost:2532per me. Si scopre che è stato impostato in questo modo dal precedente proprietario nell'area specificata. Ora che quel mistero è chiaro, rende alcune altre cose meno misteriose. Grazie!
Suamere,

7

Penso che sia necessario controllare le impostazioni del proxy in "Opzioni Internet". Se si utilizzano applicazioni proxy / 'nascondi ip', questo problema può verificarsi.


È questo un tipico problema di Windows 7? Alcune impostazioni predefinite sono diverse rispetto ad altre versioni di Windows?
Lupo,

@Wolf, penso che questo non sia un problema di Windows. ma potrebbe trattarsi di un problema di connessione.
isaeid,

Vai su Internet Explorer -> Opzioni Internet -> scheda Connessioni -> Impostazioni LAN, deseleziona "Usa un server proxy per la tua LAN". Questo ha risolto il problema per me.
Mike Kuenzi,

Nella mia applicazione, ho incluso un'opzione proxy (WPAD) perché gli utenti potrebbero richiederla. Io non. Tuttavia, l'ho attivato sul mio computer di prova e ciò causerebbe l'errore. Pertanto, se non è necessario utilizzare un proxy, non è possibile definirne uno nell'applicazione.
potente il

4

Ho avuto lo stesso problema. Il problema è che non ho avviato il server selenio. Ho scaricato il server selenio e l'ho avviato. Dopo aver avviato il server selenio, il problema è andato e tutto ha funzionato bene.

Fare riferimento a questo: http://coding-issues.blogspot.in/2012/11/no-connection-could-be-made-because.html


1
La domanda non menzionava nulla sul server selenio.
Geoff Dawdy,

1
@GeoffDawdy È solo un altro esempio per la ragione numero 1 della risposta di Will - supporta l'apprendimento attraverso la ripetizione ;-)
Lupo,

4

Vai al tuo progetto WCF - proprietà -> ragnatela-> debugger -> deseleziona la casella di controllo

Abilita Modifica e Continua


10
Cosa fa questo?
Wouter Vanherck,

3

Ho avuto lo stesso errore con il mio servizio WCF utilizzando l'associazione Net TCP, ma nel mio caso ho risolto dopo aver avviato i servizi seguenti.

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Servizio di condivisione delle porte Net.Tcp


1
Fantastico, mi stavo togliendo i capelli. Nota a piè di pagina: l'esecuzione del servizio WC.T NET.TCP su un PC Windows 7 non ha richiesto l'esecuzione di questi 3 servizi. Tuttavia, in esecuzione su Windows Server (ho testato il 2003 e il 2008) questi servizi dovevano essere in esecuzione affinché WCF fosse in grado di correggere.
smirkingman

3

Questo è davvero specifico, ma se si riceve questo errore dopo aver provato a connettersi a un database utilizzando mongo, ciò che ha funzionato per me è stato eseguire mongod.exe prima di eseguire mongo.exe e quindi la connessione ha funzionato bene. Spero che questo aiuti qualcuno.


3

Ho riscontrato lo stesso errore perché quando il tuo server e client vengono eseguiti sullo stesso computer, il client ha bisogno di un indirizzo IP locale del server non di un indirizzo IP pubblico per comunicare con il server, hai bisogno dell'indirizzo IP pubblico solo nel caso in cui il server e il client vengano eseguiti su un computer separato, quindi utilizza l'indirizzo IP locale nel programma client per connettersi con il server L'indirizzo IP locale può essere trovato usando questo metodo.

 public static string Getlocalip()
    {
        try
        {
            IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
            return localIPs[7].ToString();
        }
        catch (Exception)
        {

            return "null";
        }

    }

Quello era il mio scenario: come soluzione alternativa, se stai indicando un nome host che si risolve in un IP pubblico, potresti anche voler modificare il file HOST della tua macchina server e aggiungere una regola che instrada il tuo nome host su 127.0.0.1.
Darkseal,

3

Ho riscontrato questo errore in un'applicazione che utilizza AppFabric. L'indizio stava ottenendo una DataCacheExceptiontraccia nello stack. Per vedere se questo è il problema per te, esegui il seguente comando PowerShell:

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

Se uno di questi due servizi viene arrestato, verrà visualizzato questo errore.


Grazie. Come nota a margine, per riferimento futuro a me stesso e agli altri, sembrava funzionare quando ho iniziato il servizio ma l'app stava avendo tutti i tipi di lentezza e alla fine ho twigged (d'uh) che il servizio sull'altro server in AppFabric il cluster non è stato attivato.
Segna il

2

Bene, ho ricevuto questo errore oggi su Windows 8 a 64 bit di punto in bianco, per la prima volta, e risulta che my.ini era stato ripristinato e il file bin / mysqld era stato eliminato, tra gli altri elementi nella "Program Files/MySQL/MySQL Server 5.6"cartella.

Per risolvere il problema, ho dovuto eseguire nuovamente il programma di installazione di MySQL, installando solo il server e copiare una versione recente del file my.ini "ProgramData/MySQL/MySQL Server 5.6", nominata my_2014-03-28T15-51-20.ininel mio caso (non so come o perché sia ​​stato copiato lì di recente) di nuovo in "Program Files/MySQL/MySQL Server 5.6".

L'unica modifica al sistema da quando MySQL ha funzionato è stata l'installazione della Traktor 2 di Native Instruments e di una scheda audio Traktor Audio 2, che in realtà non avrebbe dovuto causare questo problema, e nessun altro ha usato il sistema oltre a me. Se qualcuno ha un indizio, sarebbe gentile da parte tua commentare per impedirlo per me e per chiunque lo abbia incontrato.


Ho avuto lo stesso problema e basta hack per risolverlo è fermare i servizi MyQsl tramite services.msc. Tuttavia, MySql non sarà più disponibile, quindi è necessario riavviare il computer per riaverlo.
Gabriel,

2

Per riferimento di servizio all'interno di una soluzione.

  1. Riavvia la workstation

  2. Ricostruisci la tua soluzione

  3. Aggiorna riferimento al servizio nel progetto WCFclient

A questo punto, ho ricevuto un messaggio (Windows 7) per consentire l'accesso al sistema. Quindi il riferimento al servizio è stato aggiornato correttamente senza errori.


2

Vorrei condividere questa risposta che ho trovato perché la causa del problema non era il firewall o il processo non era in ascolto corretto, era l'esempio di codice fornito da Microsoft che ho usato.

https://msdn.microsoft.com/en-us/library/system.net.sockets.socket%28v=vs.110%29.aspx

Ho implementato questa funzione quasi esattamente come scritto, ma quello che è successo è che ho ricevuto questo errore:

05-01-2016 12: 00: 48,075 [10] ERRORE - L'errore è: System.Net.Sockets.SocketException (0x80004005): Impossibile stabilire una connessione perché la macchina di destinazione l'ha rifiutata attivamente [fe80 :: caa: 745: a1da:% e6f1 11]: 4080

Questo codice direbbe che il socket è collegato, ma non con l'indirizzo IP corretto effettivamente necessario per una comunicazione corretta. (Fornito da Microsoft)

private static Socket ConnectSocket(string server, int port)
    {
        Socket s = null;
        IPHostEntry hostEntry = null;

        // Get host related information.
        hostEntry = Dns.GetHostEntry(server);

        // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
        // an exception that occurs when the host IP Address is not compatible with the address family
        // (typical in the IPv6 case).
        foreach(IPAddress address in hostEntry.AddressList)
        {
            IPEndPoint ipe = new IPEndPoint(address, port);
            Socket tempSocket = 
                new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            tempSocket.Connect(ipe);

            if(tempSocket.Connected)
            {
                s = tempSocket;
                break;
            }
            else
            {
                continue;
            }
        }
        return s;
    }

Ho riscritto il codice per usare solo il primo IP valido che trova. Mi occupo solo dell'uso di IPV4, ma funziona con localhost, 127.0.0.1 e l'indirizzo IP della tua scheda di rete, dove l'esempio fornito da Microsoft non è riuscito!

    private Socket ConnectSocket(string server, int port)
    {
        Socket s = null;

        try
        {
            // Get host related information.
            IPAddress[] ips;
            ips = Dns.GetHostAddresses(server);

            Socket tempSocket = null;
            IPEndPoint ipe = null;

            ipe = new IPEndPoint((IPAddress)ips.GetValue(0), port);
            tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            Platform.Log(LogLevel.Info, "Attempting socket connection to " + ips.GetValue(0).ToString() + " on port " + port.ToString());
            tempSocket.Connect(ipe);

            if (tempSocket.Connected)
            {
                s = tempSocket;
                s.SendTimeout = Coordinate.HL7SendTimeout;
                s.ReceiveTimeout = Coordinate.HL7ReceiveTimeout;
            }
            else
            {
                return null;
            }

            return s;
        }
        catch (Exception e)
        {
            Platform.Log(LogLevel.Error, "Error creating socket connection to " + server + " on port " + port.ToString());
            Platform.Log(LogLevel.Error, "The error is: " + e.ToString());
            if (g_NoOutputForThreading == false)
                rtbResponse.AppendText("Error creating socket connection to " + server + " on port " + port.ToString());
            return null;
        }
    }

2

Nel mio caso, alcuni domini hanno funzionato, mentre altri no. L'aggiunta di un riferimento all'URL proxy della mia organizzazione nel mio web.config ha risolto il problema.

<system.net>
    <defaultProxy useDefaultCredentials="true">
      <proxy proxyaddress="http://proxy.my-org.com/" usesystemdefault="True"/>
    </defaultProxy>
</system.net>

1

Ho ricevuto questo errore dai servizi di riferimento situati su un WCFHost dal mio livello Web. Ciò che ha funzionato per me potrebbe non essere applicabile a tutti, ma sto lasciando questa risposta per coloro che potrebbero. Il numero di porta per il mio WCFHost è stato aggiornato casualmente da IIS, ho semplicemente dovuto aggiornare le rotte finali ai riferimenti svc nella mia configurazione web. Problema risolto.


1

Nel mio scenario, ho due applicazioni:

  • App1
  • app2

Presupposto : App1 dovrebbe ascoltare le attività di App2 su Port 5000

Errore : l'avvio di App1 e il tentativo di ascoltare, in una città fantasma inesistente, produce l'errore

Soluzione : avviare prima App2, quindi provare ad ascoltare utilizzando App1


1

Un'altra possibilità -

Assicurati di provare ad aprire lo stesso indirizzo IP di quello che stai ascoltando. La mia app server stava ascoltando l'indirizzo IP della macchina host utilizzando IPv6, ma il client stava tentando di connettersi all'indirizzo IPv4 della macchina host.


1

Nel mio caso, ciò è stato causato da una distribuzione errata in cui non è stata effettuata un'impostazione nel mio web.config.

Un collega ha spiegato che l'indirizzo IP nel messaggio di errore rappresenta l'host locale.

Quando ho corretto web.config stavo usando l'URL corretto per effettuare le chiamate al server e ha funzionato.

Ho pensato di pubblicarlo nel caso potesse aiutare qualcuno.


0

Utilizzando WampServer 64 bit su Windows 7 Home Premium 64 bit ho riscontrato questo problema esatto. Dopo ore e ore di sperimentazione è diventato evidente che tutto ciò che era necessario era in my.ini per commentare una riga. Quindi ha funzionato bene.

commentato 1 riga socket = mysql

Se metti i tuoi vecchi / dati / file nella posizione appropriata, WampServer li accetterà tutti tranne la cartella / mysql / su cui scrive. Quindi ho semplicemente importato un backup dei dati / mysql / user dal mio ambiente di sviluppo precedente ed ho eseguito FLUSH PRIVILEGES in una finestra SQL phpMyAdmin. Funziona alla grande. Qualcosa deve essere sbagliato perché le cose non dovrebbero essere così facili.


0

Ho avuto questo problema accadendo spesso. Ho trovato che il SQL Server Agentservizio non era in esecuzione. Una volta avviato il servizio manualmente, è stato risolto. Ricontrolla se il servizio è in esecuzione o meno:

  1. Esegui prompt, digita services.msce premi invio
  2. Trova il nome del servizio - SQL Server Agent( Nome istanza )

Se SQL Server Agentnon è in esecuzione, fare doppio clic sul servizio per aprire la finestra delle proprietà. Quindi fare clic sul Startpulsante. Spero che possa aiutare qualcuno.


Perché l'agente SQL Server dovrebbe avere a che fare con IIS? Forse intendevi il servizio WWW?
Nick.McDermaid

0

Ho riscontrato questo errore e ho impiegato del tempo per risolverlo. Nel mio caso avevo https e net.tcp configurati come collegamenti IIS sulla stessa porta. Ovviamente non puoi avere due cose sulla stessa porta. Ho usato il comando netstat -ap tcp per verificare se c'è qualcosa in ascolto su quella porta. Non c'era nessuno in ascolto. La rimozione dell'associazione non necessaria (https nel mio caso) ha risolto il mio problema.


0

Era un problema sciocco da parte mia, avevo aggiunto un proxy predefinito al mio web.config per intercettare il traffico in Fiddler, e poi ho dimenticato di rimuoverlo!


0

Esiste un servizio chiamato "SQL Server Browser" che fornisce ai client informazioni sulla connessione di SQL Server.

Nel mio caso, nessuna delle soluzioni esistenti ha funzionato perché questo servizio non era in esecuzione. L'ho ripreso e tutto è tornato a funzionare perfettamente.


0

Stavo affrontando questo problema oggi. Il mio era Asp.Net Core API e utilizza Postgresqlcome database. Abbiamo configurato questo database come contenitore Docker. Quindi il primo passo che ho fatto è stato verificare se sono in grado di accedere al database o meno. Per fare ciò ho cercato PgAdminall'inizio poiché ho configurato lo stesso. Facendo clic sull'applicazione risultante si reindirizzerà a http://127.0.0.1:23722/browser/ . Lì puoi provare ad accedere al tuo database nel menu a sinistra. Per me stavo ricevendo un errore come nell'immagine qui sotto.

inserisci qui la descrizione dell'immagine

Inserisci la password e prova se puoi accedervi o meno. Per me non funzionava. Essendo un contenitore Docker, ho deciso di riavviare il desktop Docker, per fare clic con il tasto destro sull'icona della finestra mobile nella barra delle applicazioni e fare clic su Riavvia.

Una volta dopo aver riavviato la finestra mobile, sono stato in grado di accedere e vedere il database e anche l'errore è scomparso quando riavvio l'applicazione in Visual Studio .

Spero che sia d'aiuto.


0

potrebbe essere a causa di problemi di autorizzazione; quello era il caso per me. Se hai ad esempio: [Authorize("WriteAccess")]o [Authorize("ReadAccess")]nella parte superiore delle funzioni del controller, prova a commentarle.


0

Per me, volevo avviare il mongo in shell (non pertinente al contesto esatto della domanda, ma avendo lo stesso messaggio di errore anche prima di avviare il mongo in shell)

Il processo "MongoDB Service" non era in esecuzione in Servizi

Avvia cmd come amministratore e digita,

net start MongoDB

Solo per vedere MongoDB è attivo e funzionante basta digitare mongo, in cmd fornirà i dettagli della versione di Mongo e l'URL della connessione Mongo


0

Ho appena affrontato questo momento ...

inserisci qui la descrizione dell'immagine

Qui da parte mia, ho 2 soluzioni separate di Visual Studio (.sln) ... ognuna aperta nella propria istanza di Visual Studio.

La soluzione 2 chiama il codice soluzione 1. Il problema era correlato alla porta assegnata alla soluzione 1. Ho dovuto cambiare la porta della soluzione 1 con un'altra e quindi la soluzione 2 ha ripreso a funzionare. Quindi assicurati di controllare la porta assegnata al tuo progetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.