Невозможно установить соединение, потому что целевая машина активно отказалась от него?


260

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


System.Net.WebException: Невозможно подключиться к удаленному серверу ---> System.Net.Sockets.SocketException: Невозможно установить соединение, поскольку целевая машина активно отказала ему 127.0.0.1:80
   в System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress)
   в System.Net.Sockets.Socket.InternalConnect (EndPoint remoteEP)
   в System.Net.ServicePoint.ConnectSocketInternal (логическое connectFailure, сокет s4, сокет s6, сокет и сокет, IP-адрес и адрес, состояние ConnectSocketState, IAsyncResult asyncResult, тайм-аут Int32, исключение и исключение)
   --- Конец внутренней трассировки стека исключений ---
   в 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
Я только что наткнулся на соединение с Azure. Можно с уверенностью сказать, что целевой компьютер доступен. Проблема сохраняется после перезагрузки и перезагрузки маршрутизатора. Weird. Проблема? Скрипач не выключился должным образом. Система все еще ожидала маршрутизации трафика через Fiddler, и это была «целевая машина», которая была недоступна.
Вок,

Может ли это быть как-то связано с используемыми сокетами? Вы закрываете их на выходе?
Джордж Сп

Ответы:


204

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

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

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

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

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

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

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


Да, я получаю это иногда, не всегда, я не думаю, что причина - это брандмауэр или что-то еще, но причиной этой проблемы может быть отставание. Есть ли способ решить эту проблему?
hsnkvk

@hsnkvk; правильный надежный способ для клиента - иметь цикл повторения; ответ обновляется соответственно
будет

@Будет; У меня уже есть iterationCount, и я повторяю время iterationCount, если это не удается. :(
hsnkvk

1
Это вещь. Плохо разработанный / настроенный довольно расплывчато, как вы сказали. Под проверкой кода вы подразумеваете, что хотите просмотреть код, который вызывает веб-сервис? Я не опубликовал его как тот же код, что и тот, который вызывает первый веб-сервис, и тот работает идеально. Есть ли на сервере какое-либо свойство, которое можно настроить через web.config, которое может повлиять на второе веб-приложение?
Амит Джордж

9
127.0.0.1:80 предполагает, что веб-служба находится на локальном компьютере, что делает проблемы с сетью непривычными. Очень приятно то, что во время тестирования веб-служба запускалась медленнее, чем клиентское приложение. Тем не менее, добавление логики повторения определенно поможет.
Мартин Браун

31

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

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

Из статьи возможны следующие причины:

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

9
Я знаю, что это старый, но вы могли бы добавить Fiddler в этот список. Отключение Fiddler во время запуска приложения, а затем повторное подключение заставило мои сокеты работать правильно.
ps2goat

1
Большой палец для Fiddler
Калин

3
У меня был установлен fiddler на компьютере разработчика, и это вызвало эту проблему, у меня не было открытого fiddler при запуске этого конкретного проекта, и я получил ошибку. Когда я открыл Fiddler во время работы над проектом, он работал
Питер Питлок

16

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

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

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

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

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

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

Ура :)


2
Это не было общеизвестным для меня. Я был в замешательстве, как черт, почему моя ошибка указана LocalHost:2532для меня. Оказывается, он был установлен таким образом предыдущим владельцем в указанной вами области. Теперь, когда эта тайна ясна, некоторые другие вещи становятся менее загадочными. Спасибо!
Суамер

7

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


Это типичная проблема Windows 7? Отличаются ли некоторые значения по умолчанию от других версий Windows?
Wolf

@ Волк, я думаю, это не проблема окон. но это может быть проблема с подключением.
isaeid

Перейдите в IE -> Свойства обозревателя -> вкладка Подключения -> Параметры локальной сети, снимите флажок «Использовать прокси-сервер для вашей локальной сети». Это решило проблему для меня.
Майк Куензи

В моем приложении я включил параметр прокси (WPAD), потому что пользователям может потребоваться это. Я не. Однако я активировал его на своем тестовом компьютере, и это могло вызвать сбой. Поэтому, если вам не нужно использовать прокси, вы не можете определить его в своем приложении.
Могучий

4

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

См. Это: http://coding-issues.blogspot.in/2012/11/no-connection-could-be-made-because.html


1
Вопрос не упоминал ничего о сервере селена.
Джефф Доуди

1
@GeoffDawdy Это просто еще один пример по причине № 1 ответа Уилла - поддерживает обучение через повторение ;-)
Wolf

4

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

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


10
Что это делает?
Wouter Vanherck

3

У меня была та же ошибка с моей службой WCF, использующей привязку Net TCP, но она была устранена после запуска перечисленных ниже служб в моем случае.

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Net.Tcp Port Sharing Service


1
Блестяще, я вырывал свои волосы. Сноска. Для запуска моей службы WCF NET.TCP на ПК с Windows 7 эти 3 службы не требовались. Однако при работе на Windows Server (я тестировал 2003 и 2008) эти службы должны были работать для WCF, чтобы можно было их исправить.
ухмылка

3

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


3

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

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

            return "null";
        }

    }

Это был мой сценарий: в качестве альтернативного исправления, если вы указываете на имя хоста, которое преобразуется в публичный IP, вы также можете отредактировать файл HOST вашего сервера и добавить правило, которое направляет ваше имя хоста на 127.0.0.1.
Darkseal

3

Я получил эту ошибку в приложении, которое использует AppFabric. Подсказка была DataCacheExceptionв следе стека. Чтобы узнать, является ли это проблемой для вас, выполните следующую команду PowerShell:

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

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


Спасибо. В качестве примечания, для справки в будущем к себе и другим, он появился на работу вэнь я начал службу , но приложение было иметь все виды медлительности , и я , наконец , twigged (d'эм) , что сервис на другом сервере в AppFabric кластер не был включен.
Марк

2

Что ж, сегодня я впервые получил эту ошибку на 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, которая действительно не должна была вызывать эту проблему, и никто, кроме меня, не использовал эту систему. Если у кого-то есть подсказка, просим вас прокомментировать, чтобы предотвратить это для меня и всех, кто сталкивался с этим.


У меня была та же проблема, и теперь ее можно решить, чтобы остановить службы MyQsl через services.msc. Тем не менее, MySql после этого недоступен, поэтому вам нужно перезагрузить компьютер, чтобы иметь его снова.
Габриэль

2

Для справки в рамках решения.

  1. Перезагрузите вашу рабочую станцию

  2. Восстановите свое решение

  3. Обновить ссылку на сервис в проекте WCFclient

В этот момент я получил сообщение (Windows 7), чтобы разрешить доступ к системе. Затем сервисная справка была обновлена ​​корректно без ошибок.


2

Я хотел бы поделиться этим ответом, который нашел, потому что причиной проблемы был не брандмауэр или процесс, который не слушал правильно, а пример кода, предоставленный 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;
        }
    }

2

В моем случае некоторые домены работали, а некоторые нет. Добавление ссылки на URL-адрес прокси-сервера моей организации в файле web.config устранило проблему.

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

1

Я получил эту ошибку от служб ссылок, расположенных на WCFHost с моего веб-уровня. То, что сработало для меня, может не относиться ко всем, но я оставляю этот ответ для тех, кому это может. Номер порта для моего WCFHost был случайно обновлен IIS, мне просто пришлось обновить конечные маршруты до ссылок svc в моей веб-конфигурации. Задача решена.


1

В моем сценарии у меня есть два приложения:

  • App1
  • App2

Предположение : App1 должен прослушивать действия App2 на порте 5000

Ошибка : при запуске App1 и попытке прослушать несуществующий город-призрак возникает ошибка

Решение : сначала запустите App2, затем попробуйте прослушать, используя App1


1

Еще одна возможность -

Убедитесь, что вы пытаетесь открыть тот же IP-адрес, где вы слушаете. Приложение моего сервера прослушивало IP-адрес хост-машины, используя IPv6, но клиент пытался подключиться по IPv4-адресу хост-машины.


1

В моем случае это было вызвано неправильным развертыванием, где настройка в моем web.config не была сделана.

Коллега объяснил, что IP-адрес в сообщении об ошибке представляет локальный хост.

Когда я исправил файл web.config, я использовал правильный URL для выполнения вызовов сервера, и это сработало.

Я думал, что отправлю это в случае, если это может кому-то помочь.


0

Используя WampServer 64bit на Windows 7 Home Premium 64bit, я столкнулся с этой проблемой. После нескольких часов экспериментирования стало очевидно, что все, что нужно было в my.ini, чтобы закомментировать одну строку. Тогда все работало нормально.

закомментировал 1 строку сокета = MySQL

Если вы поместите ваши старые / data / files в соответствующее место, WampServer примет их все, кроме папки / mysql /, которую он перезаписывает. Затем я просто импортировал резервную копию данных / mysql / user из предыдущей среды разработки и запустил PRIVILEGES FLUSH в окне phpMyAdmin SQL. Прекрасно работает. Что-то должно быть не так, потому что все не должно быть так просто.


0

У меня эта проблема случалась часто. Я обнаружил, что SQL Server Agentслужба не работает. Как только я запустил сервис вручную, он был исправлен. Дважды проверьте, работает служба или нет:

  1. Запустите приглашение, введите services.mscи нажмите Enter
  2. Найти имя службы - SQL Server Agent( Имя экземпляра )

Если SQL Server Agentне работает, дважды щелкните сервис, чтобы открыть окно свойств. Затем нажмите на Startкнопку. Надеюсь, это кому-нибудь поможет.


Почему агент SQL Server имеет какое-либо отношение к IIS? Может быть, вы имели в виду сервис WWW?
Nick.McDermaid

0

Я столкнулся с этой ошибкой и занял некоторое время, чтобы решить ее. В моем случае https и net.tcp были настроены как привязки IIS к одному порту. Очевидно, вы не можете иметь две вещи на одном порту. Я использовал команду netstat -ap tcp, чтобы проверить, прослушивает ли что-то этот порт. Там не было ни одного слушающего. Удаление ненужной привязки (https в моем случае) решило мою проблему.


0

С моей стороны это было глупо, я добавил в свой web.config прокси по умолчанию для перехвата трафика в Fiddler, а потом забыл его удалить!


0

Существует служба, называемая «Браузер SQL Server», которая предоставляет клиентам информацию о подключении к SQL Server.

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


0

Я столкнулся с этой проблемой сегодня. Мой был Asp.Net Core API, и он использует Postgresqlв качестве базы данных. Мы настроили эту базу данных как контейнер Docker. Поэтому первым делом я проверил, могу ли я получить доступ к базе данных или нет. Для этого я искал PgAdminв начале, как я настроил то же самое. Нажав на появившееся приложение, вы перейдете на страницу http://127.0.0.1:23722/browser/ . Там вы можете попробовать получить доступ к вашей базе данных в левом меню. Для меня я получил ошибку, как на рисунке ниже.

введите описание изображения здесь

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

Однажды после перезапуска Docker я смог войти в систему и увидеть базу данных, а также ошибка исчезла при перезапуске приложения в Visual Studio .

Надеюсь, поможет.


0

это может быть из-за проблем с авторизацией; это был случай для меня. Если у вас есть, например: [Authorize("WriteAccess")]или [Authorize("ReadAccess")]в верхней части функций вашего контроллера, попробуйте закомментировать их.


0

Для меня я хотел запустить монго в оболочке (независимо от точного контекста вопроса, но с тем же сообщением об ошибке, даже до запуска монго в оболочке)

Процесс 'Служба MongoDB' не был запущен в Службах

Запустите cmd от имени администратора и введите

net start MongoDB

Просто чтобы убедиться, что MongoDB запущен и работает, просто наберите mongo, в cmd он предоставит сведения о версии Mongo и URL-адрес подключения к Mongo


0

Я только что столкнулся с этим прямо сейчас ...

введите описание изображения здесь

Здесь, в конце концов, у меня есть 2 отдельных решения Visual Studio (.sln) ... открытое каждое в своем собственном экземпляре Visual Studio.

Решение 2 вызывает код решения 1. Проблема была связана с портом, назначенным для решения 1. Мне пришлось сменить порт в решении 1 на другой, а затем решение 2 снова начало работать. Поэтому убедитесь, что вы проверите порт, назначенный вашему проекту.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.