¿No se pudo establecer la conexión porque la máquina de destino la rechazó activamente?


260

A veces recibo el siguiente error mientras hacía HttpWebRequest a un servicio web. Copié mi código a continuación también.


System.Net.WebException: no se puede conectar al servidor remoto ---> System.Net.Sockets.SocketException: no se pudo establecer conexión porque la máquina de destino lo rechazó activamente 127.0.0.1:80
   en System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress)
   en System.Net.Sockets.Socket.InternalConnect (EndPoint remoteEP)
   en System.Net.ServicePoint.ConnectSocketInternal (Boolean connectFailure, Socket s4, Socket s6, Socket & socket, IPAddress & address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception & excepcion)
   --- Fin del rastro interno de la pila de excepciones ---
   en 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
Acabo de encontrarme con esta conexión a Azure. Es bastante seguro decir que la máquina de destino está disponible. El problema persistió después de reiniciar y reiniciar el enrutador. Extraño. ¿Problema? Fiddler no se había apagado correctamente. El sistema todavía esperaba enrutar el tráfico a través de Fiddler y esa es la 'máquina de destino' que no estaba disponible.
Vok

¿Podría esto tener algo que ver con los enchufes utilizados? ¿Los cierras a la salida?
George Sp

Respuestas:


204

Si esto sucede siempre, significa literalmente que la máquina existe pero que no tiene servicios escuchando en el puerto especificado o que hay un firewall que lo detiene.

Si sucede ocasionalmente (usó la palabra "a veces") y el reintento se realiza correctamente, es probable que el servidor tenga un "retraso" completo.

Cuando espera ser accepteditado en un enchufe de escucha, se le coloca en una cartera de pedidos. Esta cartera de pedidos es finita y bastante corta (los valores de 1, 2 o 3 no son inusuales) y, por lo tanto, el sistema operativo no puede poner en cola su solicitud para que la 'aceptar' consuma.

El backlog es un parámetro en la listenfunción: todos los lenguajes y plataformas tienen básicamente la misma API a este respecto, incluso el C # one . Este parámetro a menudo es configurable si controla el servidor, y es probable que se lea de algún archivo de configuración o del registro. Investigue cómo configurar su servidor.

Si escribió el servidor, es posible que tenga un procesamiento pesado en la aceptación de su socket, y esto se puede mover mejor a un subproceso de trabajo separado para que su aceptación esté siempre lista para recibir conexiones. Hay varias opciones de arquitectura que puede explorar para mitigar la cola de clientes y procesarlos secuencialmente.

Independientemente de si puede aumentar el trabajo atrasado del servidor, es necesario volver a intentar la lógica en su código de cliente para hacer frente a este problema, ya que incluso con un trabajo atrasado prolongado, el servidor podría estar recibiendo muchas otras solicitudes en ese puerto en ese momento.

Existe una rara posibilidad de que un enrutador NAT dé este error si se agotan sus puertos para las asignaciones. Sin embargo, creo que podemos descartar esta posibilidad como una posibilidad remota, ya que el enrutador tiene 64K conexiones simultáneas a la misma dirección / puerto de destino antes del agotamiento.


Sí, lo recibo ocasionalmente, no siempre, no creo que la razón sea firewall o cualquier otra cosa, pero el retraso puede ser la razón de este problema. ¿Hay alguna forma de resolver este problema?
hsnkvk

@hsnkvk; la manera sólida adecuada es que el cliente tenga un ciclo de reintento; respuesta actualizada en consecuencia
Will

@Será; Ya tengo un iterationCount y reintento iterationCount veces si falla. :(
hsnkvk

1
Esa es la cosa. Mal diseñado / configurado es bastante vago como dijiste. Por inspección de código, ¿quiere decir que desea ver el código que llama al servicio web? No lo publiqué ya que es exactamente el mismo código que el que llama al primer servicio web y ese funciona perfecto. ¿Hay alguna propiedad en el servidor que se pueda configurar a través de web.config que pueda afectar a la segunda aplicación web?
Amith George el

9
127.0.0.1:80 sugiere que el servicio web está en la máquina local, lo que hace que los problemas de red sean poco probables. Lo más probable es que el servicio web se haya iniciado más lentamente que la aplicación cliente durante las pruebas. Aún agregar lógica de reintento es definitivamente el camino a seguir.
Martin Brown

31

La razón más probable es un cortafuegos.

Este artículo contiene una serie de razones que pueden serle útiles.

Del artículo, las posibles razones podrían ser:

  • Configuración del servidor FTP
  • Configuración de software / firewall personal
  • Software múltiple / cortafuegos personales
  • Software antivirus
  • Capa LSP
  • Firmware del enrutador
  • Computadora apagada
  • Computadora no conectada
  • Violinista

9
Sé que esto es viejo, pero podría agregar Fiddler a esta lista. desconectar el violinista durante el inicio de la aplicación, luego volver a conectarlo hizo que mis enchufes funcionaran correctamente
ps2goat

1
Thumb up for Fiddler
Kalin Krastev

3
Tenía instalado el fiddler en la máquina de desarrollo y esto causó este problema, no tenía el fiddler abierto al ejecutar este proyecto específico y obtuve el error. Cuando abrí el violinista mientras ejecutaba el proyecto, funcionó
Peter PitLock

16

Esto me sucedió a mí también. A veces, cuando abro mi proyecto, aparece este error que era frustrante. El problema era que a veces el número de puerto del servicio web estaba cambiando inesperadamente.

Este problema generalmente ocurre cuando tienes más de una copia del proyecto

Mi proyecto estaba llamando al servicio web con un número de puerto específico que asigné en el archivo Web.Config de mi archivo de proyecto principal. Como el número de puerto cambió inesperadamente, el navegador no pudo encontrar el servicio web y arrojó ese error.

Resolví esto siguiendo los pasos a continuación: (Visual Studio 2010)

Vaya a Propiedades del Web serviceproyecto -> haga clic en la pestaña Web -> en la sección Servidores -> Verifique el puerto específico y luego asigne el standard port numberpor el cual su proyecto principal llama al servicio web.

Espero que esto resuelva el problema.

Salud :)


2
Esto no era de conocimiento común para mí. Me he confundido como diablos sobre por qué mi error me lo especificó LocalHost:2532. Resulta que fue establecido de esa manera por el propietario anterior en el área que especificó. Ahora que ese misterio es claro, hace que otras cosas sean menos misteriosas. ¡Gracias!
Suamere

7

Creo que debe verificar la configuración de su proxy en "opciones de Internet". Si está utilizando aplicaciones proxy / 'hide ip', este problema puede ocurrir.


¿Es este un problema típico de Windows 7? ¿Hay algunos valores predeterminados diferentes en comparación con otras versiones de Windows?
Wolf

@ Wolf, creo que este no es un problema de Windows. pero, puede ser un problema de conexión.
isaeid

Vaya a IE -> Opciones de Internet -> pestaña Conexiones -> Configuración de LAN, desmarque "Usar un servidor proxy para su LAN". Esto solucionó el problema para mí.
Mike Kuenzi

En mi aplicación, incluí una opción de proxy (WPAD) porque los usuarios pueden requerirla. Yo no. Sin embargo, lo activé en mi computadora de prueba, y eso causaría la falla. Entonces, si no tiene que usar un proxy, no puede definir uno en su aplicación.
Poderoso

4

Yo tuve el mismo problema. El problema es que no inicié el servidor de selenio. He descargado el servidor de selenio y lo inicié. Después de iniciar el servidor de selenio, el problema desapareció y todo funcionó bien.

Consulte esto: http://coding-issues.blogspot.in/2012/11/no-connection-could-be-made-because.html


1
La pregunta no mencionó nada sobre el servidor de selenio.
Geoff Dawdy

1
@GeoffDawdy Es solo otro ejemplo por la razón # 1 de la respuesta de Will - apoya el aprendizaje a través de la repetición ;-)
Wolf

4

Vaya a su proyecto WCF - propiedades -> Web-> depuradores -> desmarque la casilla de verificación

Habilite Editar y continuar


10
¿Qué hace esto?
Wouter Vanherck

3

Tuve el mismo error con mi servicio WCF usando el enlace Net TCP, pero resolví después de iniciar los siguientes servicios en mi caso.

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Servicio de uso compartido de puertos Net.Tcp


1
Brillante, me estaba sacando el pelo. Nota al pie: La ejecución de mi servicio WCF NET.TCP en una PC con Windows 7 no requirió la ejecución de estos 3 servicios. Sin embargo, ejecutándose en Windows Server (probé 2003 y 2008), estos servicios tenían que ejecutarse para WCF para poder corregirlos.
smirkingman

3

Esto es realmente específico, pero si recibe este error después de intentar conectarse a una base de datos usando mongo, lo que funcionó para mí fue ejecutar mongod.exe antes de ejecutar mongo.exe y luego la conexión funcionó bien. Espero que esto ayude a alguien.


3

Enfrenté el mismo error porque cuando su Servidor y Cliente se ejecutan en la misma máquina, el Cliente necesita una dirección IP local del servidor, no una dirección IP pública para comunicarse con el servidor, necesita una dirección IP pública solo en caso de que el Servidor y el Cliente se ejecuten en una máquina separada, use la dirección IP local en el programa cliente para conectarse con el servidor La dirección IP local se puede encontrar usando este método.

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

            return "null";
        }

    }

Ese era mi escenario: como una solución alternativa, si está apuntando a un nombre de host que se resuelve en una IP pública, es posible que también desee editar el archivo HOST de su máquina servidor y agregar una regla que enrute su nombre de host a 127.0.0.1.
Darkseal

3

Recibí este error en una aplicación que usa AppFabric. La pista estaba obteniendo un DataCacheExceptionrastro en la pila. Para ver si este es el problema, ejecute el siguiente comando de PowerShell:

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

Si alguno de estos dos servicios se detiene, obtendrá este error.


Gracias. Como nota al margen, para referencia futura a mí mismo y a los demás, parecía funcionar cuando comencé el servicio, pero la aplicación estaba experimentando todo tipo de lentitud y finalmente me di cuenta de que el servicio en el otro servidor en AppFabric el clúster no estaba encendido.
Mark

2

Bueno, recibí este error hoy en Windows 8 de 64 bits de la nada, por primera vez, y resultó que mi my.ini se había restablecido y el archivo bin / mysqld se había eliminado, entre otros elementos. en la "Program Files/MySQL/MySQL Server 5.6"carpeta

Para solucionarlo, tuve que volver a ejecutar el instalador MySQL, instalar solo el servidor y copiar una versión reciente del archivo my.ini "ProgramData/MySQL/MySQL Server 5.6", nombrado my_2014-03-28T15-51-20.inien mi caso (no sé cómo ni por qué se copió allí tan recientemente) de vuelta en "Program Files/MySQL/MySQL Server 5.6".

El único cambio en el sistema desde que MySQL funcionó fue la instalación de Traktor 2 de Native Instruments y una tarjeta de sonido Traktor Audio 2, que realmente no debería haber causado este problema, y ​​nadie más ha usado el sistema además de mí. Si alguien tiene una pista, sería amable de su parte comentar para evitar esto para mí y para cualquier otra persona que haya encontrado esto.


Tuve el mismo problema y el único truco para resolverlo es detener los servicios de MyQsl a través de services.msc. Sin embargo, MySql no está disponible después de eso, por lo que debe reiniciar la computadora para tenerlo nuevamente.
Gabriel

2

Para referencia de servicio dentro de una solución.

  1. Reinicia tu estación de trabajo

  2. Reconstruye tu solución

  3. Referencia de servicio de actualización en el proyecto WCFclient

En este punto, recibí un mensaje (Windows 7) para permitir el acceso al sistema. Luego, la referencia de servicio se actualizó correctamente sin errores.


2

Me gustaría compartir esta respuesta que encontré porque la causa del problema no era el firewall o el proceso no escuchaba correctamente, era la muestra de código proporcionada por Microsoft que utilicé.

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

Implementé esta función casi exactamente como está escrita, pero lo que sucedió es que recibí este error:

2016-01-05 12: 00: 48,075 [10] ERROR - El error es: System.Net.Sockets.SocketException (0x80004005): No se pudo establecer conexión porque la máquina de destino lo rechazó activamente [fe80 :: caa: 745: a1da: e6f1% 11]: 4080

Este código diría que el socket está conectado, pero no bajo la dirección IP correcta realmente necesaria para una comunicación adecuada. (Proporcionado por 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;
    }

Reescribí el código para usar la primera IP válida que encuentra. Solo me preocupa que IPV4 use esto, pero funciona con localhost, 127.0.0.1, y la dirección IP de su tarjeta de red, ¡donde el ejemplo proporcionado por Microsoft falló!

    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

En mi caso, algunos dominios funcionaron, mientras que otros no. Agregar una referencia a la URL proxy de mi organización en mi web.config solucionó el problema.

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

1

Recibí este error de los servicios de referencia ubicados en un WCFHost de mi nivel web. Lo que funcionó para mí puede no aplicarse a todos, pero dejo esta respuesta para aquellos a los que puede. El número de puerto para mi WCFHost fue actualizado aleatoriamente por IIS, simplemente tuve que actualizar las rutas finales a las referencias svc en mi configuración web. Problema resuelto.


1

En mi escenario, tengo dos aplicaciones:

  • App1
  • App2

Supuesto : App1 debería escuchar las actividades de App2 en el Puerto 5000

Error : iniciar App1 e intentar escuchar, en un pueblo fantasma inexistente, produce el error

Solución : Inicie App2 primero, luego intente escuchar usando App1


1

Una posibilidad más:

Asegúrese de que está intentando abrir la misma dirección IP donde está escuchando. La aplicación de mi servidor estaba escuchando la dirección IP de la máquina host usando IPv6, pero el cliente intentaba conectarse en la dirección IPv4 de la máquina host.


1

En mi caso, esto fue causado por una implementación defectuosa donde no se realizó una configuración en mi web.config.

Un colega explicó que la dirección IP en el mensaje de error representa el host local.

Cuando corregí el web.config, estaba usando la URL correcta para hacer las llamadas al servidor y funcionó.

Pensé en publicar esto en caso de que pueda ayudar a alguien.


0

Usando WampServer 64bit en Windows 7 Home Premium 64bit encontré este problema exacto. Después de horas y horas de experimentación, se hizo evidente que todo lo que se necesitaba estaba en my.ini para comentar una línea. Entonces funcionó bien.

comentó 1 socket de línea = mysql

Si coloca sus archivos / data / old en la ubicación adecuada, WampServer los aceptará todos excepto la carpeta / mysql / que sobrescribe. Entonces, simplemente importé una copia de seguridad de los datos / mysql / user de mi entorno de desarrollo anterior y ejecuté FLUSH PRIVILEGES en una ventana phpMyAdmin SQL. Funciona genial. Algo debe estar mal porque las cosas no deberían ser tan fáciles.


0

Tuve este problema a menudo. Encontré que el SQL Server Agentservicio no se estaba ejecutando. Una vez que comencé el servicio manualmente, se solucionó. Verifique si el servicio se está ejecutando o no:

  1. Ejecute prompt, escriba services.mscy presione enter
  2. Encuentra el nombre del servicio - SQL Server Agent( Nombre de instancia )

Si SQL Server Agentno se está ejecutando, haga doble clic en el servicio para abrir la ventana de propiedades. Luego haga clic en el Startbotón. Espero que ayude a alguien.


¿Por qué el agente de SQL Server tendría algo que ver con IIS? ¿Quizás te referías al servicio WWW?
Nick.McDermaid

0

Encontré este error y me tomé un tiempo para resolverlo. En mi caso, tenía https y net.tcp configurados como enlaces IIS en el mismo puerto. Obviamente no puedes tener dos cosas en el mismo puerto. Usé el comando netstat -ap tcp para verificar si hay algo escuchando en ese puerto. No había nadie escuchando. Eliminar el enlace innecesario (https en mi caso) resolvió mi problema.


0

Fue un problema tonto por mi parte, había agregado un proxy predeterminado a mi web.config para interceptar el tráfico en Fiddler, ¡y luego olvidé eliminarlo!


0

Hay un servicio llamado "Explorador de SQL Server" que proporciona información de conexión de SQL Server a los clientes.

En mi caso, ninguna de las soluciones existentes funcionó porque este servicio no se estaba ejecutando. Lo reanudé y todo volvió a funcionar perfectamente.


0

Me enfrentaba a este problema hoy. La mía fue Asp.Net Core API y se usa Postgresqlcomo base de datos. Hemos configurado esta base de datos como un contenedor Docker. Entonces, el primer paso que hice fue verificar si puedo acceder a la base de datos o no. Para hacer eso busqué PgAdminal principio ya que configuré lo mismo. Al hacer clic en la aplicación resultante, se lo redireccionará a http://127.0.0.1:23722/browser/ . Allí puede intentar acceder a su base de datos en el menú de la izquierda. Para mí recibí un error como en la imagen de abajo.

ingrese la descripción de la imagen aquí

Ingrese la contraseña e intente si puede acceder a ella o no. Para mí no estaba funcionando. Como es un contenedor Docker, decidí reiniciar mi escritorio Docker, para hacer eso, haga clic derecho en el icono de Docker en la barra de tareas y haga clic en reiniciar.

Una vez después de reiniciar el Docker, pude iniciar sesión y ver la base de datos y también el error desapareció cuando reinicio la aplicación en Visual Studio .

Espero eso ayude.


0

puede deberse a problemas de autorización; Ese fue el caso para mí. Si tiene, por ejemplo: [Authorize("WriteAccess")]o [Authorize("ReadAccess")]en la parte superior de las funciones de su controlador, intente comentarlas.


0

Para mí, quería comenzar el mongo en shell (irrelevante para el contexto exacto de la pregunta, pero tener el mismo mensaje de error incluso antes de comenzar el mongo en shell)

El proceso 'Servicio MongoDB' no se estaba ejecutando en Servicios

Inicie cmd como administrador y escriba,

net start MongoDB

Solo para ver que MongoDB está en funcionamiento, solo escriba mongo, en cmd le dará los detalles de la versión de Mongo y la URL de conexión de Mongo


0

Acabo de enfrentar esto ahora ...

ingrese la descripción de la imagen aquí

Aquí, por mi parte, tengo 2 soluciones de Visual Studio separadas (.sln) ... abiertas cada una en su propia instancia de Visual Studio.

La solución 2 llama al código de la solución 1. El problema estaba relacionado con el puerto asignado a la Solución 1. Tuve que cambiar el puerto de la solución 1 a otro y luego la Solución 2 comenzó a funcionar nuevamente. Así que asegúrese de verificar el puerto asignado a su proyecto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.