Às vezes eu recebo o seguinte erro enquanto eu estava fazendo o HttpWebRequest para um WebService. Eu também copiei meu código abaixo.
System.Net.WebException: Incapaz de se conectar ao servidor remoto ---> System.Net.Sockets.SocketException: Nenhuma conexão pôde ser feita porque a máquina alvo recusou-a ativamente 127.0.0.1:80 em System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) em System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP) em System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& excepção) --- Fim do traço da pilha de exceção interna --- em 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();
Se isto acontecer sempre, significa literalmente que a máquina existe, mas que não tem serviços escutando na porta especificada, ou que há um firewall parando você.
Se acontecer ocasionalmente - você usou a palavra "às vezes" - e tentar novamente com sucesso, é provável porque o servidor tem um 'backlog'.
Quando você está esperando para ser aceito
em uma tomada de escuta, você é colocado em um backlog. Este backlog é finito e bastante curto - valores de 1, 2 ou 3 não são incomuns - e assim o SO pode ser incapaz de enfileirar seu pedido para o 'accept' para consumir.
O backlog é um parâmetro na função `listen' - todas as linguagens e plataformas têm basicamente a mesma API neste aspecto, mesmo a C# um. Este parâmetro é muitas vezes configurável se você controlar o servidor, e provavelmente é lido a partir de algum arquivo de configurações ou do registro. Investigue como configurar o seu servidor.
Se você escreveu o servidor, você pode ter um processamento pesado na aceitação do seu socket, e este pode ser melhor movido para um worker-thread separado para que sua aceitação esteja sempre pronta para receber conexões. Há várias opções de arquitetura que você pode explorar que mitigam o enfileiramento de clientes e o processamento seqüencialmente.
Independentemente de você poder aumentar o backlog do servidor, você precisa de lógica retry no código do seu cliente para lidar com esse problema - já que mesmo com um longo backlog o servidor pode estar recebendo muitos outros pedidos nessa porta naquele momento.
Há uma possibilidade rara de um roteador NAT dar esse erro caso suas portas para mapeamentos se esgotem. Acho que podemos descartar essa possibilidade como um tiro no escuro, uma vez que o roteador tem 64K conexões simultâneas para o mesmo endereço/porta de destino antes da exaustão.
A razão mais possível é um Firewall.
Este artigo contém um conjunto de razões. Pode ser útil para você.
Pelo artigo, os possíveis motivos poderiam ser:
Isto também me aconteceu a mim... Às vezes, quando abro o meu projecto, este erro apareceu, o que foi frustrante. O problema era que às vezes o número de portas do serviço web estava mudando inesperadamente.
**Este problema geralmente acontece quando você tem mais de uma cópia do projeto***.
Meu projeto estava chamando o serviço Web com um número de porta específico que eu atribuí no arquivo Web.Config do meu arquivo principal de projeto. Como o número da porta mudou inesperadamente, o navegador não foi capaz de encontrar o serviço Web e atirou esse erro.
Eu resolvi isso seguindo os passos abaixo: (Visual Studio 2010)
Ir para Propriedades do projeto
Serviço Web
--> clicar em Servers tab --> Em Servers seção --> Verificar Porta específica e depois atribuir onúmero de porta padrão
pelo qual seu projeto principal está chamando o serviço web.
Espero que isto resolva o problema.
Abraço :)