Невозможно установить соединение, потому что целевая машина активно отказалась от него? - PullRequest
217 голосов
/ 04 июня 2010

Иногда я получаю следующую ошибку, когда выполняю HttpWebRequest для WebService. Я тоже скопировал код ниже.


System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 127.0.0.1:80
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at 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)
   --- End of inner exception stack trace ---
   at 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();

Ответы [ 24 ]

178 голосов
/ 04 июня 2010

Если это происходит всегда, это буквально означает, что машина существует, но у нее нет служб, прослушивающих указанный порт, или брандмауэр останавливает вас.

Если это случается время от времени - вы использовали слово «иногда» - и повторная попытка завершается успешно, скорее всего, потому, что у сервера полное «отставание».

Когда вы ожидаете получения accept ed на слушающем сокете, вы попадаете в очередь. Это отставание является конечным и довольно коротким - значения 1, 2 или 3 не являются необычными - и поэтому ОС может быть не в состоянии поставить в очередь ваш запрос на получение «accept».

Задержка - это параметр функции listen - все языки и платформы имеют в основном один и тот же API в этом отношении, даже C # one . Этот параметр часто настраивается, если вы управляете сервером, и, скорее всего, читается из какого-либо файла настроек или реестра. Изучите, как настроить ваш сервер.

Если вы написали сервер, у вас может быть тяжелая обработка при принятии вашего сокета, и это может быть лучше перенесено в отдельный рабочий поток, чтобы ваше принятие всегда было готово к приему соединений. Вы можете изучить различные варианты архитектуры, которые уменьшают очередь клиентов и обрабатывают их последовательно.

Независимо от того, от того, можете ли вы увеличить отставание сервера, вам нужна логика retry в вашем клиентском коде, чтобы справиться с этой проблемой - как даже с длительное отставание сервер может получать много других запросов на этот порт в то время.

Существует редкая возможность, когда маршрутизатор NAT выдаст эту ошибку, если его порты для сопоставлений будут исчерпаны. Я думаю, что мы можем отбросить эту возможность как слишком большую перспективу, поскольку маршрутизатор имеет 64K одновременных подключений к одному и тому же адресу / порту назначения до исчерпания.

29 голосов
/ 04 июня 2010

Наиболее вероятная причина - это брандмауэр.

Эта статья содержит ряд причин.Это может быть полезно для вас.

Исходя из статьи, возможными причинами могут быть:

  • Настройки FTP-сервера
  • Настройки программного / персонального брандмауэра
  • Несколько программных / персональных брандмауэров
  • Антивирусное программное обеспечение
  • Уровень LSP
  • Прошивка маршрутизатора
  • Компьютер выключен
  • Компьютер не подключенВ
14 голосов
/ 29 декабря 2012

Это тоже случилось со мной .. Иногда, когда я открываю свой проект, появлялась эта ошибка, которая расстраивала. Проблема заключалась в том, что иногда номер порта веб-службы неожиданно менялся.

Эта проблема обычно возникает, когда у вас есть более одной копии проекта

Мой проект вызывал веб-службу с определенным номером порта, который я назначил в файле Web.Config моего основного файла проекта. Поскольку номер порта неожиданно изменился, браузер не смог найти веб-службу и выдал эту ошибку.

Я решил эту проблему, выполнив следующие действия: (Visual Studio 2010)

Перейдите в Свойства проекта Web service -> нажмите на вкладку Интернет -> В разделе Серверы -> Проверить Определенный порт а затем назначьте standard port number, по которому ваш основной проект вызывает веб-сервис.

Я надеюсь, что это решит проблему.

Приветствия:)

6 голосов
/ 02 декабря 2014

Думаю, вам нужно проверить настройки прокси в "настройках интернета". Если вы используете прокси / приложения «Hide ip», эта проблема может возникнуть.

4 голосов
/ 11 июля 2013

У меня была такая же проблема. Проблема в том, что я не запустил сервер селен. Я скачал сервер селена и начал его. После запуска сервера селен проблема исчезла и все работало нормально.

См. Это: http://coding -issues.blogspot.in / 2012/11 / соединение невозможно сделать, потому что .html

3 голосов
/ 15 марта 2016

Это действительно специфично, но если вы получаете эту ошибку после попытки подключиться к базе данных с помощью mongo, у меня получилось запустить mongod.exe до запуска mongo.exe, а затем соединение работало нормально. Надеюсь, это кому-нибудь поможет.

3 голосов
/ 21 марта 2017

Я столкнулся с той же ошибкой, потому что когда ваш Сервер и Клиент работают на одной и той же машине, Клиенту необходим локальный IP-адрес сервера, а не Открытый IP-адрес, для связи с сервером вам нужен Общий IP-адрес только в случае, когда Сервер и Клиент работают на отдельной машине, поэтому Локальный IP-адрес в клиентской программе для соединения с сервером Локальный IP-адрес можно найти с помощью этого метода.

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

            return "null";
        }

    }
2 голосов
/ 12 апреля 2017

Перейти к вашему проекту WCF - свойства -> Web -> отладчики -> снять флажок

Включить редактирование и продолжить

2 голосов
/ 07 апреля 2014

Ну, сегодня я получил эту ошибку на 64-битной Windows 8 впервые, и оказалось, что мой my.ini был сброшен, а файл bin / mysqld был удален, среди других элементов в папке "Program Files/MySQL/MySQL Server 5.6".

Чтобы это исправить, мне пришлось снова запустить установщик MySQL, установить только сервер и скопировать последнюю версию файла my.ini из "ProgramData/MySQL/MySQL Server 5.6", в моем случае с именем my_2014-03-28T15-51-20.ini (не знаю как или почему это было скопировано так недавно) обратно в "Program Files/MySQL/MySQL Server 5.6".

Единственное изменение в системе со времени работы MySQL - это установка Traktor 2 от Native Instruments и звуковой карты Traktor Audio 2, которая действительно не должна была вызывать эту проблему, и никто, кроме меня, не использовал систему. Если у кого-то есть подсказка, просим вас прокомментировать, чтобы предотвратить это для меня и всех, кто сталкивался с этим.

2 голосов
/ 06 января 2016

Я хотел бы поделиться этим ответом, который нашел, потому что причиной проблемы был не брандмауэр или процесс, который не слушал правильно, а образец кода, предоставленный Microsoft, который я использовал.

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

Я реализовал эту функцию почти так, как написано, но случилось то, что я получил эту ошибку:

2016-01-05 12: 00: 48,075 [10] ОШИБКА - ошибка: System.Net.Sockets.SocketException (0x80004005): не удалось установить соединение, поскольку целевая машина активно отказала ему [fe80 :: caa : 745: a1da: e6f1% 11]: 4080

Этот код сказал бы, что сокет подключен, но не под правильным IP-адресом, фактически необходимым для правильной связи. (Предоставлено 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;
    }

Я переписал код, чтобы использовать только первый действительный IP-адрес, который он нашел. Я касаюсь только IPV4, использующего это, но он работает с localhost, 127.0.0.1, и фактически с IP-адресом вашей сетевой карты, где пример, предоставленный Microsoft, не удался!

    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;
        }
    }
...