Nenhuma conexão pôde ser estabelecida porque a máquina de destino a recusou ativamente?


260

Às vezes, recebo o seguinte erro enquanto fazia HttpWebRequest em um WebService. Também copiei meu código abaixo.


System.Net.WebException: Não foi possível conectar-se ao servidor remoto ---> System.Net.Sockets.SocketException: Nenhuma conexão pôde ser estabelecida porque a máquina de destino a recusou 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, Soquete s4, Soquete s6, Soquete e soquete, Endereço IP e endereço, Estado ConnectSocketState, IAsyncResult asyncResult, Int32 timeout, Exceção e exceção)
   --- Fim do rastreamento 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();

1
Acabei de executar essa conexão com o Azure. É bastante seguro dizer que a máquina de destino está disponível. O problema persistiu após a reinicialização e a redefinição do roteador. Esquisito. Problema? Violinista não desligou corretamente. O sistema ainda esperava rotear o tráfego pelo Fiddler e essa é a 'máquina de destino' que não estava disponível.
Vok

Isso poderia ter algo a ver com os soquetes usados? Você os fecha na saída?
George Sp

Respostas:


204

Se isso acontecer sempre, significa literalmente que a máquina existe, mas que não possui serviços atendendo na porta especificada ou existe um firewall para você.

Se isso acontecer ocasionalmente - você usou a palavra "às vezes" - e tentar novamente com êxito, é provável que o servidor tenha um 'backlog' completo.

Quando você está esperando para estar accept editado em um soquete de escuta, você é colocado em uma lista de pendências. Esse backlog é finito e bastante curto - valores de 1, 2 ou 3 não são incomuns - portanto, o sistema operacional pode não conseguir enfileirar sua solicitação para o 'accept' consumir.

O backlog é um parâmetro da listenfunção - todos os idiomas e plataformas têm basicamente a mesma API nesse sentido, mesmo o C # . Esse parâmetro geralmente é configurável se você controlar o servidor e provavelmente é lido em algum arquivo de configurações ou no registro. Investigue como configurar seu servidor.

Se você criou o servidor, pode ter um processamento pesado na aceitação do seu soquete, e isso pode ser melhor movido para um thread de trabalho separado, para que a sua aceitação esteja sempre pronta para receber conexões. Existem várias opções de arquitetura que você pode explorar que atenuam a fila de clientes e os processam sequencialmente.

Independentemente de você poder aumentar a lista de pendências do servidor, é necessário tentar novamente a lógica no código do cliente para lidar com esse problema - mesmo com uma lista pendente longa, o servidor pode estar recebendo muitas outras solicitações nessa porta naquele momento.

Há uma possibilidade rara de um roteador NAT dar esse erro caso suas portas para mapeamentos sejam esgotadas. Acho que podemos descartar essa possibilidade como um tiro no escuro, já que o roteador tem 64K conexões simultâneas com o mesmo endereço / porta de destino antes da exaustão.


Sim, eu entendi ocasionalmente, nem sempre, não acho que a razão seja firewall ou qualquer outra coisa, mas a lista de pendências pode ser a razão desse problema. Existe alguma maneira de resolver esse problema?
hsnkvk

@hsnkvk; a maneira correta e robusta é que o cliente tenha um loop de repetição; answer actualizado em conformidade
Will

@Vai; Eu já tenho um iterationCount e repito iterationCount vezes, se ele falhar. :(
hsnkvk

1
Essa e a coisa. Mal projetado / configurado é bastante vago, como você disse. Por inspeção de código, você quer ver o código que chama o serviço da web? Eu não o publiquei como exatamente o mesmo código que chama o primeiro serviço da web e que funciona perfeitamente. Existe alguma propriedade no servidor que possa ser configurada via web.config que possa afetar o segundo aplicativo da web?
Amith George

9
O 127.0.0.1:80 sugere que o serviço da Web esteja na máquina local, o que torna improváveis ​​os problemas de rede. O mais provável é que o serviço da Web tenha iniciado mais lentamente que o aplicativo cliente durante o teste. Ainda adicionar lógica de repetição é definitivamente o caminho a percorrer.
Martin Brown

31

O motivo mais provável é um firewall.

Este artigo contém um conjunto de razões, que podem ser úteis para você.

A partir do artigo, os possíveis motivos podem ser:

  • Configurações do servidor FTP
  • Configurações de software / firewall pessoal
  • Vários softwares / firewalls pessoais
  • Software antivírus
  • Camada LSP
  • Firmware do roteador
  • Computador desligado
  • Computador não conectado
  • Violinista

9
Sei que isso é antigo, mas você pode adicionar o Fiddler a esta lista. desanexar o violinista durante a inicialização do aplicativo e reconectá-lo fizeram meus soquetes funcionarem corretamente.
Ps2goat 02/09

1
Thumb up for Fiddler
Kalin Krastev

3
Eu tinha o violinista instalado na máquina dev e isso causou esse problema, não tive o violinista aberto ao executar este projeto específico e obtive o erro. Quando abri violinista enquanto a execução do projeto, ele trabalhou
Peter PitLock

16

Isso aconteceu comigo também. Às vezes, quando abro meu projeto, aparece um erro frustrante. O problema era que, às vezes, o número da porta do serviço da web mudava inesperadamente.

Esse problema geralmente ocorre quando você possui mais de uma cópia do projeto.

Meu projeto estava chamando o serviço da Web com um número de porta específico que eu atribuí no arquivo Web.Config do meu arquivo de projeto principal. Como o número da porta mudou inesperadamente, o navegador não conseguiu encontrar o serviço da Web e lançou esse erro.

Resolvi isso seguindo as etapas abaixo: (Visual Studio 2010)

Vá para Propriedades do Web serviceprojeto -> clique na guia Web -> Na seção Servidores -> Marque a porta específica e atribua a standard port numberqual seu projeto principal está chamando o serviço da web.

Espero que isso resolva o problema.

Felicidades :)


2
Isso não era um conhecimento comum para mim. Fiquei confuso como por que meu erro foi especificado LocalHost:2532para mim. Acontece que foi definido dessa maneira pelo proprietário anterior na área que você especificou. Agora que esse mistério está claro, torna outras coisas menos misteriosas. Obrigado!
Suamere 17/03/14

7

Eu acho que você precisa verificar suas configurações de proxy em "opções da internet". Se você estiver usando aplicativos proxy / 'ocultar ip', esse problema pode ocorrer.


Esse é um problema típico do Windows 7? Alguns padrões são diferentes em comparação com outras versões do Windows?
Wolf

@ Wolf, acho que isso não é problema do Windows. mas, pode ser um problema de conexão.
Isaid #

Vá para IE -> Opções da Internet -> guia Conexões -> Configurações da LAN, desmarque a opção "Usar um servidor proxy para sua LAN". Isso corrigiu o problema para mim.
Mike Kuenzi

No meu aplicativo, incluí uma opção de proxy (WPAD) porque os usuários podem solicitá-la. Eu não. No entanto, eu o ativei no meu computador de teste e isso causaria a falha. Portanto, se você não precisar usar um proxy, não poderá definir um no seu aplicativo.
tmighty

4

Eu tive o mesmo problema. O problema é que não iniciei o servidor selênio. Fiz o download do servidor selenium e o iniciei. Depois de iniciar o servidor selenium, o problema desapareceu e tudo funcionou bem.

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


1
A pergunta não mencionou nada sobre o servidor selênio.
Geoff Dawdy

1
@GeoffDawdy É apenas outro exemplo para a razão # 1 de resposta de Will - suportes de aprendizagem através da repetição ;-)
Lobo

4

Vá para o seu projeto WCF - propriedades -> Rede -> depuradores -> desmarque a caixa de seleção

Ativar Editar e continuar


10
O que isso faz?
Wouter Vanherck

3

Eu tive o mesmo erro no meu serviço WCF usando a ligação Net TCP, mas resolvi depois de iniciar os serviços abaixo no meu caso.

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Serviço de compartilhamento de porta Net.Tcp


1
Brilhante, eu estava puxando meu cabelo. Nota de rodapé: A execução do meu serviço WCF NET.TCP em um PC com Windows 7 não exigia a execução desses três serviços. No entanto, executando no Windows Server (eu testei 2003 e 2008), esses serviços precisavam estar em execução para o WCF poder corrigir.
Smirkingman 5/05

3

Isso é realmente específico, mas se você receber esse erro depois de tentar se conectar a um banco de dados usando o mongo, o que funcionou para mim foi executar o mongod.exe antes de executar o mongo.exe e a conexão funcionou bem. Espero que isso ajude alguém.


3

Eu enfrentei o mesmo erro porque, quando o servidor e o cliente são executados na mesma máquina, o cliente precisa do endereço IP local do servidor e não do endereço IP público para se comunicar com o servidor, você precisa do endereço IP público apenas no caso em que o servidor e o cliente executam em uma máquina separada, use o endereço IP local no programa cliente para conectar-se ao servidor O endereço IP local pode ser encontrado usando este método.

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

            return "null";
        }

    }

Esse foi o meu cenário: como uma correção alternativa, se você estiver apontando para um nome de host que se resolve em um IP público, convém editar o arquivo HOST da máquina do servidor e adicionar uma regra que direcione seu nome de host para 127.0.0.1.
precisa saber é o seguinte

3

Eu recebi esse erro em um aplicativo que usa o AppFabric. A pista estava recebendo um DataCacheExceptionrastreio na pilha. Para verificar se esse é o problema, execute o seguinte comando do PowerShell:

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

Se um desses dois serviços for interrompido, você receberá esse erro.


Obrigado. Como uma observação lateral, para referência futura a mim e aos outros, pareceu funcionar quando eu iniciei o serviço, mas o aplicativo estava com todos os tipos de lentidão e finalmente gostei (d'uh) de que o serviço no outro servidor no AppFabric o cluster não estava ativado.
Mark

2

Bem, eu recebi esse erro hoje no Windows 8 de 64 bits, pela primeira vez, e meu my.ini foi redefinido e o arquivo bin / mysqld foi excluído, entre outros itens no "Program Files/MySQL/MySQL Server 5.6" pasta

Para corrigi-lo, tive que executar o instalador do MySQL novamente, instalando apenas o servidor e copiar uma versão recente do arquivo my.ini "ProgramData/MySQL/MySQL Server 5.6", com o nome my_2014-03-28T15-51-20.inino meu caso (não sei como ou por que isso foi copiado recentemente) de volta para"Program Files/MySQL/MySQL Server 5.6" .

A única alteração no sistema desde que o MySQL funcionou foi a instalação do Traktor 2 da Native Instruments e de uma placa de som do Traktor Audio 2, que realmente não deveria ter causado esse problema, e ninguém mais usou o sistema além de mim. Se alguém tiver uma pista, seria gentil de sua parte comentar para evitar isso para mim e para qualquer outra pessoa que tenha encontrado isso.


Eu tive o mesmo problema e onw hack para resolvê-lo é parar os serviços MyQsl via services.msc. No entanto, o MySql não estará disponível depois disso, portanto, você precisará reiniciar o computador para tê-lo novamente.
Gabriel

2

Para referência de serviço em uma solução.

  1. Reinicie sua estação de trabalho

  2. Reconstrua sua solução

  3. Atualizar referência de serviço no projeto WCFclient

Nesse ponto, recebi uma mensagem (Windows 7) para permitir o acesso ao sistema. Em seguida, a referência de serviço foi atualizada corretamente sem erros.


2

Gostaria de compartilhar esta resposta que encontrei porque a causa do problema não foi o firewall ou o processo não estava escutando corretamente, foi o exemplo de código fornecido pela Microsoft que eu usei.

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

Eu implementei essa função quase exatamente como foi escrita, mas o que aconteceu foi que eu recebi este erro:

2016-01-05 12: 00: 48,075 [10] ERRO - O erro é: System.Net.Sockets.SocketException (0x80004005): Nenhuma conexão pôde ser estabelecida porque a máquina de destino a recusou ativamente [fe80 :: caa: 745: a1da: e6f1% 11]: 4080

Este código diria que o soquete está conectado, mas não sob o endereço IP correto realmente necessário para a comunicação adequada. (Fornecido pela 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;
    }

Reescrevi o código para usar apenas o primeiro IP válido encontrado. Estou preocupado apenas com o IPV4 usando isso, mas ele funciona com o host local, 127.0.0.1, e o endereço IP da sua placa de rede, onde o exemplo fornecido pela Microsoft falhou!

    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

No meu caso, alguns domínios funcionaram, enquanto outros não. A adição de uma referência ao URL do proxy da minha organização em meu web.config corrigiu o problema.

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

1

Eu recebi esse erro dos serviços de referência localizados em um WCFHost da minha camada da web. O que funcionou para mim pode não se aplicar a todos, mas estou deixando essa resposta para quem puder. O número da porta do meu WCFHost foi atualizado aleatoriamente pelo IIS; eu simplesmente tive que atualizar as rotas finais para as referências svc na minha configuração da web. Problema resolvido.


1

No meu cenário, tenho dois aplicativos:

  • App1
  • App2

Suposição : App1 deve ouvir as atividades do App2 na porta 5000

Erro : iniciar o App1 e tentar ouvir uma cidade fantasma inexistente gera o erro

Solução : inicie o App2 primeiro e tente ouvir usando o App1


1

Mais uma possibilidade -

Verifique se você está tentando abrir o mesmo endereço IP do local onde está ouvindo. Meu aplicativo de servidor estava ouvindo o endereço IP da máquina host usando IPv6, mas o cliente estava tentando se conectar ao endereço IPv4 da máquina host.


1

No meu caso, isso foi causado por uma implantação defeituosa, na qual uma configuração no meu web.config não foi feita.

Um colega explicou que o endereço IP na mensagem de erro representa o host local.

Quando corrigi o web.config, estava usando o URL correto para fazer as chamadas do servidor e funcionou.

Eu pensei em publicar isso, caso isso possa ajudar alguém.


0

Usando o WampServer 64bit no Windows 7 Home Premium 64bit, encontrei esse problema exato. Depois de horas e horas de experimentação, ficou claro que tudo o que era necessário estava no my.ini para comentar uma linha. Então funcionou bem.

comentou 1 socket de linha = mysql

Se você colocar seus / data / arquivos antigos no local apropriado, o WampServer aceitará todos eles, exceto a pasta / mysql / que ele escreve. Então, simplesmente importei um backup dos dados do / mysql / user do meu ambiente de desenvolvimento anterior e executei o FLUSH PRIVILEGES em uma janela SQL do phpMyAdmin. Funciona bem. Algo deve estar errado, porque as coisas não devem ser tão fáceis.


0

Eu tive esse problema acontecendo com frequência. Achei que o SQL Server Agentserviço não estava em execução. Depois que iniciei o serviço manualmente, ele foi corrigido. Verifique se o serviço está sendo executado ou não:

  1. Executar prompt, digite services.msc e pressione Enter
  2. Encontre o nome do serviço - SQL Server Agent( Nome da Instância )

Se SQL Server Agentnão estiver em execução, clique duas vezes no serviço para abrir a janela de propriedades. Depois clique no Startbotão Espero que ajude alguém.


Por que o agente do SQL Server tem algo a ver com o IIS? Talvez você quis dizer o serviço WWW?
Nick.McDermaid

0

Me deparei com esse erro e demorei um pouco para resolvê-lo. No meu caso, eu tinha https e net.tcp configurados como ligações do IIS na mesma porta. Obviamente, você não pode ter duas coisas na mesma porta. Usei o comando netstat -ap tcp para verificar se há algo escutando nessa porta. Não havia ninguém ouvindo. A remoção de ligações desnecessárias (https no meu caso) resolveu meu problema.


0

Foi um problema bobo do meu lado, eu adicionei um proxy padrão ao meu web.config para interceptar o tráfego no Fiddler e esqueci de removê-lo!


0

Existe um serviço chamado "Navegador do SQL Server" que fornece informações de conexão do SQL Server aos clientes.

No meu caso, nenhuma das soluções existentes funcionou porque este serviço não estava sendo executado. Eu retomei e tudo voltou a funcionar perfeitamente.


0

Eu estava enfrentando esse problema hoje. O meu era o Asp.Net Core API e o usa Postgresqlcomo banco de dados. Configuramos esse banco de dados como um contêiner do Docker. Portanto, o primeiro passo que fiz foi verificar se sou capaz de acessar o banco de dados ou não. Para fazer isso, procurei PgAdminno início, pois configurei o mesmo. Ao clicar no aplicativo resultante, você será redirecionado para o http://127.0.0.1:23722/browser/ . Lá você pode tentar acessar seu banco de dados no menu esquerdo. Para mim, estava recebendo um erro, como na imagem abaixo.

insira a descrição da imagem aqui

Digite a senha e tente se você pode acessá-la ou não. Para mim, não estava funcionando. Como é um contêiner do Docker, decidi reiniciar a área de trabalho do Docker. Para isso, clique com o botão direito do mouse no ícone do Docker na barra de tarefas e clique em reiniciar.

Depois de reiniciar o Docker, consegui efetuar login e ver o banco de dados e também ocorreu o erro ao reiniciar o aplicativo no Visual Studio .

Espero que ajude.


0

pode ser devido a problemas de autorização; esse foi o meu caso. Se você tem, por exemplo: [Authorize("WriteAccess")]ou [Authorize("ReadAccess")]na parte superior das funções do seu controlador, tente comentá-las.


0

Para mim, eu queria iniciar o mongo no shell (irrelevante o contexto exato da pergunta, mas com a mesma mensagem de erro antes de iniciar o mongo no shell)

O processo 'MongoDB Service' não estava sendo executado nos Serviços

Inicie o cmd como administrador e digite,

net start MongoDB

Apenas para ver o MongoDB em funcionamento, digite mongo, no cmd ele fornecerá detalhes da versão do Mongo e o URL de conexão do Mongo


0

Eu acabei de enfrentar isso agora ...

insira a descrição da imagem aqui

Aqui, do meu lado, eu tenho duas soluções separadas do Visual Studio (.sln) ... abri cada uma em sua própria instância do Visual Studio.

A solução 2 chama o código da solução 1. O problema estava relacionado à porta atribuída à Solução 1. Tive que alterar a porta na solução 1 para outra e, em seguida, a Solução 2 começou a funcionar novamente. Portanto, verifique a porta atribuída ao seu projeto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.