2012-03-14 240 views
51

Estoy usando la plantilla WCF4.0 - REST. Estoy intentando hacer un método que cargue un archivo usando una secuencia.No se pudo establecer ninguna conexión porque la máquina de destino la rechazó activamente. 127.0.0.1:3446

El problema siempre se producen en

Stream serverStream = request.GetRequestStream(); 

Clase para la transmisión:

namespace LogicClass 
{ 
    public class StreamClass : IStreamClass 
    { 
     public bool UploadFile(string filename, Stream fileStream) 
     { 
      try 
      { 
       FileStream fileToupload = new FileStream(filename, FileMode.Create); 
       byte[] bytearray = new byte[10000]; 
       int bytesRead, totalBytesRead = 0; 
       do 
       { 
        bytesRead = fileStream.Read(bytearray, 0, bytearray.Length); 
        totalBytesRead += bytesRead; 
       } while (bytesRead > 0); 

       fileToupload.Write(bytearray, 0, bytearray.Length); 
       fileToupload.Close(); 
       fileToupload.Dispose(); 
      } 
      catch (Exception ex) { throw new Exception(ex.Message); } 
      return true; 
     } 
    } 
} 

proyecto RESTO:

[WebInvoke(UriTemplate = "AddStream/{filename}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
public bool AddStream(string filename, System.IO.Stream fileStream) 
{ 
    LogicClass.FileComponent rest = new LogicClass.FileComponent(); 
    return rest.AddStream(filename, fileStream); 
} 

proyecto de Windows Forms: para probar

private void button24_Click(object sender, EventArgs e) 
{ 
    byte[] fileStream; 
    using (FileStream fs = new FileStream("E:\\stream.txt", FileMode.Open, FileAccess.Read, FileShare.Read)) 
    { 
     fileStream = new byte[fs.Length]; 
     fs.Read(fileStream, 0, (int)fs.Length); 
     fs.Close(); 
     fs.Dispose(); 
    } 

    string baseAddress = "http://localhost:3446/File/AddStream/stream.txt"; 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(baseAddress); 
    request.Method = "POST"; 
    request.ContentType = "text/plain"; 
    Stream serverStream = request.GetRequestStream(); 
    serverStream.Write(fileStream, 0, fileStream.Length); 
    serverStream.Close(); 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     int statusCode = (int)response.StatusCode; 
     StreamReader reader = new StreamReader(response.GetResponseStream()); 
    } 
} 

He desactivado el firewall y mi conexión a Internet, pero el error todavía existe. ¿Hay una mejor manera de probar el método de carga?

traza

Stack:

en System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress) en System.Net.ServicePoint.ConnectSocketInternal (Boolean connectFailure, Socket s4, Socket s6, Socket & zócalo, direcciónIP & dirección, estado ConnectSocketState, IAsyncResult asyncResult, tiempo de espera Int32, excepción & excepción)

+1

No debería tener que preocuparse por los cortafuegos o la conexión a Internet para las conexiones locales. En su código, se está conectando al puerto '8000' pero en su mensaje de error el puerto es' 3446'. ¿Es esto relevante? –

+0

@Graphain que fue un error tipográfico. Gracias por mencionarlo. Por favor mira mi edición. – fiberOptics

Respuesta

105

"Actively refused it" significa que el host envió un restablecimiento en lugar de un ack cuando intentó conectarse. Por lo tanto, no es un problema en su código. O bien hay un firewall bloqueando la conexión o el proceso que aloja el servicio no está escuchando en ese puerto. Esto puede deberse a que no se está ejecutando o porque está escuchando en un puerto diferente.

Una vez que inicie el proceso que aloja su servicio, intente netstat -anb (requiere privilegios de administrador) para verificar que se está ejecutando y escuchando en el puerto esperado.

actualización: en Linux puede que necesite hacer netstat -anp en su lugar.

+4

gracias por el 'netstat -anb', no encuentro el puerto en la lista. ¿Conoces algunos pasos posibles para resolver esto? Apagué el firewall, deshabilité el antivirus y deshabilité la conexión a Internet, pero aún existe error. – fiberOptics

+1

¿Cómo hospedas el servicio? Si solo está presionando f5 en Visual Studio, es IIRC alojado en iisexpress.exe. Puede ver esa misma lista para el proceso de alojamiento para descubrir en qué puerto está escuchando. – Yaur

+2

"¿Cómo hospedas el servicio?" Esto realmente me detuvo para pensar por un tiempo. Intento ejecutar mi proyecto de reposo que aloja el servicio en 3445 y ejecutar también el proyecto de formulario de Windows y dirigir también el host al 3445. Entonces todo va bien. ¡Gracias! y gracias a todos. Me ayudaste mucho. – fiberOptics

1

Comprobar si cualquier otro programa está utilizando ese puerto.

Si una instancia del mismo programa aún está activa, elimine ese proceso.

+0

He hecho eso, en realidad tengo un proyecto de consola de muestra que prueba si el puerto está disponible o no. – fiberOptics

+0

Cuando tuve este problema, en realidad tuve que reiniciar mi PC para liberar el puerto. –

+1

¿Has intentado simplemente cambiar el número de puerto? Tuve un problema similar al hospedar CruiseControl, cambié el número de puerto en la configuración, que no pude encontrar con el escaneo netstat .. –

1

Si utiliza tormenta WCF, ¿puede incluso iniciar sesión en el punto final del servicio WCF? Si no es así, y lo está alojando en un servicio de Windows, probablemente haya olvidado registrar ese espacio de nombres. No está muy bien publicitado que este paso sea necesario, y en realidad es molesto hacerlo.

Yo uso this tool to do this; automatiza todos esos pasos engorrosos.

1

Recibí un mensaje de error similar al Código de error TCP 10061: No se pudo establecer una conexión porque la máquina de destino la rechazó activamente en mi proyecto actual. Encuentro que este código de error 10061 no puede distinguir el caso de que el punto final del servicio no se haya iniciado y el caso de que esté bloqueado por el firewall. A menudo, el firewall se puede apagar, pero el problema sigue ahí.

Puede probar el código de las siguientes dos maneras.

  1. Inserte el código para obtener el tiempo A en el que se inicia el servicio y el tiempo B en que el cliente envía la solicitud al servidor. Si B es anterior a A, puede causar este problema.
  2. Cambie el puerto del servidor a otro puerto que también esté disponible en el sistema. Encontrará el mismo código de error informado.

Above es mi solución. Funciona en mi máquina. ¡Espero que ayude!

1

Tuve un problema similar. En mi caso, el servicio funcionaría bien en la máquina del desarrollador, pero fallaría cuando estuviera en una máquina de QA. Resultó que en la máquina de control de calidad de la aplicación no se está ejecutando como un administrador y no tiene permiso para registrar el extremo:

HTTP no pudo registrar la URL http://+:12345/Foo.svc/]. Su proceso no tiene derechos de acceso a este espacio de nombres (vea http://go.microsoft.com/fwlink/?LinkId=70353 para más detalles).

Consulte aquí para saber cómo conseguir que funcione sin ser un usuario administrador: https://stackoverflow.com/a/885765/38258

6

No es necesario reiniciar el PC. Reinicie IIS en su lugar.

Ejecutar -> 'cmd' (como administrador) y tipo "iisreset"

+1

Veo el puerto cuando hago 'netstat -anb' y también reinicio el servidor. Todavía el mismo error, ¿alguna ayuda? –

+0

¡Ah fantástico! reiniciar 'iis' resolvió este problema para mí. ninguna de las otras soluciones trabajadas ¡Esta está subestimada! – Jawad

0

Compruebe si el número de puerto en el archivo Web.config de su página web es la misma que la que está alojada en IIS.

0

Con este error pude rastrearlo, gracias a @Yaur, básicamente tiene que comprobar el servicio (WCF) si se está ejecutando y también verificar las propiedades de TCP entrante y saliente en la configuración del firewall avanzado.

0

Tuve el mismo problema en mi servidor web "No se pudo establecer ninguna conexión porque la máquina de destino la rechazó activamente 161.x.x.235: 5672". Le pedí al administrador que abriera el puerto 5672 en el servidor web, y funcionó bien.

+1

En su servidor, abra Windows Firewall con seguridad avanzada. Agregue una nueva regla TCP entrante/saliente, ingrese el puerto 5672. Será mejor que le pida al administrador de la red que lo haga por usted. –

1

Tuve un problema similar rechazando localhost y 127.0.0.1. cmd (admin) netstat -anb encontraron el puerto que se ejecuta en 169.254.80.80 (no saben que fueron ip vino de porque mi IP de la red era 10.0.0.5 después de poner en esta IP funcionó Esto da IP correcta:..

IPAddress ipAddress = ipHostInfo.AddressList[0]; 
Console.WriteLine(ipAddress.ToString()); 
.
0

con patrón similar, mi cliente resto está llamando a la API del servicio, el servicio de llamada con éxito al depurar, pero no trabajar en el código publicado error fue: no se puede conectar con el servidor remoto

excepción interna: System. .Net.Sockets.SocketException (0x80004005): No se pudo establecer ninguna conexión porque la máquina de destino rechazó activamente el servicioIP: 443 en Sys tem.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress) en System.Net.ServicePoint.ConnectSocketInternal (Boolean connectFailure, Socket s4, Socket s6, Socket & socket, DirecciónIP & dirección, estado ConnectSocketState, IAsyncResult asyncResult, Excepción & excepción)

Resolución: establezca el proxy en la configuración web.

<system.net> 
    <defaultProxy useDefaultCredentials="true"> 
     <proxy proxyaddress="http://proxy_ip:portno/" usesystemdefault="True"/> 
    </defaultProxy> 
</system.net> 
0

Debe configurar el servidor proxy del sistema Usted tiene que pasar por este camino controlpanel >> Opciones de Internet >> connnection >> Configuración de LAN >> de proxy sin tik: Usar servidor proxy

0

También enfrenté un problema en .Net Remoting Service en C#.

lo tengo resuelto en 3 pasos:

  1. Cambiar el puerto de protocolo en todos los archivos dondequiera que se está utilizando.
  2. Ejecute su Programa de Servidor de Host y hágalo activo.
  3. Ahora ejecute su programa de cliente.
Cuestiones relacionadas