A veces me sale el siguiente error mientras hago HttpWebRequest a un WebService. También he copiado mi código de abajo.
System.Net.WebException: No se pudo conectar con el servidor remoto ---> System.Net.Sockets.SocketException: No se pudo realizar la conexión porque la máquina de destino la rechazó activamente 127.0.0.1:80 at System.Net.Sockets.Socket.DoConnect(EndPointSnapshot, SocketAddress socketAddress) en 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) --- Fin de la pila de excepciones internas 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();
Si esto ocurre siempre, significa literalmente que la máquina existe pero que no tiene servicios escuchando en el puerto especificado, o que hay un cortafuegos que lo impide.
Si ocurre ocasionalmente -has utilizado la palabra "a veces" y el reintento tiene éxito, es probable que se deba a que el servidor tiene un 'atraso' completo.
Cuando estás esperando a ser aceptado
en un socket de escucha, te colocan en un backlog. Este backlog es finito y bastante corto - valores de 1, 2 o 3 no son inusuales - y por lo tanto el SO podría ser incapaz de poner en cola tu petición para que el 'accept' la consuma.
El backlog es un parámetro de la función listen
- todos los lenguajes y plataformas tienen básicamente la misma API en este sentido, incluso la de C#. Este parámetro suele ser configurable si controlas el servidor, y es probable que se lea de algún archivo de configuración o del registro. Investiga cómo configurar tu servidor.
Si tú escribiste el servidor, puede que tengas un procesamiento pesado en el accept de tu socket, y esto puede ser mejor trasladado a un worker-thread separado para que tu accept esté siempre listo para recibir conexiones. Hay varias opciones de arquitectura que puedes explorar para mitigar la cola de clientes y procesarlos secuencialmente.
*Independientemente de si puedes aumentar el backlog del servidor, necesitas una lógica de reintento en tu código de cliente para hacer frente a este problema - ya que incluso con un largo backlog el servidor podría estar recibiendo muchas otras peticiones en ese puerto en ese momento.
Hay una rara posibilidad de que un router NAT dé este error si se agotan sus puertos para mapeos. Sin embargo, creo que podemos descartar esta posibilidad como una posibilidad demasiado remota, ya que el router tiene 64K conexiones simultáneas a la misma dirección/puerto de destino antes de agotarse.
La razón más posible es un Firewall.
Este artículo contiene un conjunto de razones. Puede ser útil para usted.
Según el artículo, las posibles razones podrían ser:
Esto también me pasó a mí... 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 cambiaba inesperadamente.
Este problema suele ocurrir cuando se tiene más de una copia del proyecto.
Mi proyecto llamaba 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 lanzó ese error.
Lo resolví siguiendo los siguientes pasos: (Visual Studio 2010)
Ir a Propiedades del proyecto Servicio web
--> hacer clic en la pestaña Web --> En la sección Servidores --> Marcar Puerto específico
y luego asigne el número de puerto estándar
por el cual su proyecto principal está llamando al servicio web.
Espero que esto resuelva el problema.
Saludos :)