Підключення не вдалося зробити, оскільки цільова машина активно відмовлялася від нього?


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 (Булева зв’язкаFailure, Socket s4, Socket s6, Socket & socket, IPAddress & адреса, стан 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. Можна сказати, що цільова машина доступна. Проблема зберігається після перезавантаження та скидання маршрутизатора. Дивно. Проблема? Фіддлер не закрився належним чином. Система все ще очікувала спрямувати трафік через Fiddler, і це "цільова машина", яка була недоступною.
Vok

Чи може це мати щось спільне з використаними розетками? Ви закриєте їх на виході?
Джордж

Відповіді:


204

Якщо це трапляється завжди, це буквально означає, що машина існує, але на ній немає служб, які прослуховують вказаний порт, або вас заважає брандмауер.

Якщо це трапляється періодично - ви вживали слово "інколи" - і повторна спроба вдається, можливо, тому що сервер має повний "відставання".

Коли ви чекаєте acceptредагування в розетці для прослуховування, вас розміщують у відставанні. Цей відставання є кінцевим і досить коротким - значення 1, 2 або 3 не є незвичайними - і тому ОС може не мати змоги поставити чергу на ваш запит щодо "прийняти" до споживання.

Відставання - це параметр listenфункції - всі мови та платформи мають в основному однаковий API в цьому плані, навіть C # one . Цей параметр часто налаштовується, якщо ви керуєте сервером, і, ймовірно, читається з якогось файла налаштувань або реєстру. Дослідіть, як налаштувати ваш сервер.

Якщо ви написали сервер, можливо, у вас буде велика обробка при прийнятті вашого сокета, і це може бути краще переміщено в окремий робочий потік, щоб ваш акцепт завжди був готовий до отримання з'єднань. Існують різні варіанти архітектури, за допомогою яких можна пом'якшити чергування клієнтів та обробляти їх послідовно.

Незалежно від того, чи можете ви збільшити відставання сервера, вам це потрібно повторна логіка у вашому клієнтському коді, щоб впоратися з цією проблемою - так як навіть із тривалим відставанням сервер може отримувати багато інших запитів на цей порт у той час.

Є рідкісна можливість, коли NAT-маршрутизатор дав би цю помилку, якщо його порти для відображень будуть вичерпані. Я думаю, що ми можемо відкинути цю можливість, як занадто багато дальнього пострілу, оскільки маршрутизатор має 64K одночасних підключень до тієї ж адреси призначення / порту до вичерпання.


Так, я отримую це періодично, не завжди, я не думаю, що причина - це брандмауер чи щось інше, але відставання може бути причиною цього питання. Чи є все-таки вирішення цього питання?
hsnkvk

@hsnkvk; належним надійним способом є те, щоб клієнт мав повторний цикл; відповідь оновлена ​​відповідно
буде

@Will; У мене вже є iterationCount, і я повторюю повтори iterationCount разів, якщо вона не працює. :(
hsnkvk

1
У цьому річ. Погано розроблений / налаштований досить невиразно, як ви сказали. Ознайомившись з кодом, ви маєте на увазі, що хочете переглянути код, який викликає веб-сервіс? Я не розміщував його як той самий той самий код, що і той, що викликає перший веб-сервіс, і той працює ідеально. Чи є на сервері якесь властивість, яке можна налаштувати через web.config, яке може вплинути на другий веб-сервер?
Аміт Джордж

9
127.0.0.1:80 дозволяє припустити, що веб-сервіс працює на локальній машині, що робить проблеми з мережею недоброзичливими. Дуже приємно, що веб-сервіс під час тестування запускався повільніше, ніж клієнтська програма. І все-таки додавання логіки повтору - це безумовно шлях.
Мартін Браун

31

Найбільш вірогідна причина - Брандмауер.

Ця стаття містить низку причин, які можуть вам стати в нагоді.

Зі статті, можливими причинами можуть бути:

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

9
Я знаю, що це старе, але ви можете додати Фіддлера до цього списку. під час запуску програми від'єднання скрипта, а потім повторне приєднання змусило мої розетки правильно працювати.
ps2goat

1
Великий палець за Фіддлера
Калін Крестев

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

16

Це трапилося і зі мною. Іноді, коли я відкриваю проект, з'явилася помилка, яка засмучує. Проблема полягала в тому, що іноді номер порту веб-сервісу несподівано змінювався.

Ця проблема зазвичай виникає, коли у вас є кілька копій проекту

Мій проект викликав веб-службу із конкретним номером порту, який я призначив у файлі Web.Config мого основного файлу проекту. Оскільки номер порту несподівано змінився, браузер не зміг знайти веб-сервіс і видав цю помилку.

Я вирішив це, виконавши наступні кроки: (Visual Studio 2010)

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

Сподіваюся, це вирішить проблему.

Ура :)


2
Це не було загальновідомим для мене. Я, як чорт, плутався, чому моя помилка вказана LocalHost:2532для мене. Виявляється, це було встановлено таким чином попереднім власником у вказаній вами області. Тепер, коли ця таємниця зрозуміла, це робить деякі інші речі менш таємничими. Дякую!
Суамер

7

Я думаю, вам потрібно перевірити налаштування проксі-сервера в "параметрах Інтернету". Якщо ви використовуєте програми проксі / 'скривати ip', ця проблема може виникнути.


Це типова проблема Windows 7? Чи відрізняються деякі параметри за замовчуванням порівняно з іншими версіями Windows?
Вовк

@Wolf, я думаю, це не проблема Windows. але, можливо, це проблема з підключенням.
isaeid

Перейдіть до IE -> Internet Options -> вкладка Connections -> LAN Settings, зніміть прапорець "Використовувати проксі-сервер для вашої локальної мережі". Це вирішило для мене проблему.
Майк Куензі

У свою програму я включив опцію проксі (WPAD), оскільки користувачі можуть цього вимагати. Я не. Однак я активував його на своєму тестовому комп'ютері, і це могло б спричинити збій. Отже, якщо вам не потрібно використовувати проксі, ви можете не визначити його у своїй програмі.
tmighty

4

У мене була така ж проблема. Проблема полягає в тому, що я не запустив сервер селену. Я завантажив селеновий сервер, і я його запустив. Після запуску сервера селену вийшов і все працювало нормально.

Посилайтеся на це: http://coding-issues.blogspot.in/2012/11/no-connection-could-be-made-begether.html


1
Питання нічого не згадувало про селеновий сервер.
Джефф Дауді

1
@GeoffDawdy Це просто ще один приклад з причини №1 відповіді Вілла - підтримує навчання через повторення ;-)
Вовк

4

Перейдіть до свого проекту WCF - властивості -> Веб -> налагоджувачі -> зніміть прапорець

Увімкнути редагування та продовжити


10
Що це робить?
Wouter Vanherck

3

У мене була та сама помилка з моєю службою WCF, що використовує Net TCP прив'язку, але усунена після запуску наведених нижче служб у моєму випадку.

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Служба спільного доступу до портів Net.Tcp


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 $_ }

Якщо будь-яка з цих двох служб зупинена, ви отримаєте цю помилку.


Дякую. Як зауваження, для подальшого посилання на себе та інших, здавалося , він працює, коли я запустив послугу, але додаток мав усілякі сповільнення, і я нарешті перекотився (d'uh), що служба на іншому сервері в AppFabric кластер не увімкнено
Марк

2

Ну, я сьогодні отримав цю помилку в Windows 8 64-розрядному розрядному середовищі, вперше, і виявляється, мій файл 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 працював, було встановлення Naktor Instruments 'Traktor 2 та звукової карти 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

У моєму випадку деякі домени працювали, а деякі - ні. Додавши посилання на проксі-сервера моєї організації в мій 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

У моєму сценарії у мене є дві програми:

  • Додаток1
  • Додаток2

Припущення : App1 повинен слухати діяльність App2 на порту 5000

Помилка : запускаючи App1 і намагаючись слухати неіснуюче місто-привид, виникає помилка

Рішення : Спершу запустіть App2, а потім спробуйте прослухати за допомогою App1


1

Ще одна можливість -

Переконайтеся, що ви намагаєтесь відкрити ту саму IP-адресу, що і прослуховування. Мій додаток сервера слухав IP-адресу хост-машини за допомогою IPv6, але клієнт намагався підключитися за IPv4-адресою хост-машини.


1

У моєму випадку це було викликано несправним розгортанням, коли налаштування в моєму web.config не було зроблено.

Колега пояснив, що IP-адреса у повідомленні про помилку представляє localhost.

Коли я виправив web.config, тоді я використовував правильний URL для здійснення серверних дзвінків, і він працював.

Я думав, що опублікую це у випадку, якщо це може комусь допомогти.


0

За допомогою WampServer 64bit у Windows 7 Home Premium 64bit я зіткнувся з цією точною проблемою. Після годин і годин експериментів стало очевидним, що все, що потрібно, було в моєму.іні, щоб прокоментувати один рядок. Тоді це спрацювало чудово.

прокоментував 1 рядок socket = mysql

Якщо ви помістите свої старі / дані / файли у відповідне місце, WampServer прийме їх усі, за винятком папки / mysql /, яку він записує. Тоді я просто імпортував резервну копію даних / mysql / користувача з мого попереднього середовища розробки та запустив ПРИМІТКИ ПРИМІТКИ у вікно SQL phpMyAdmin. Чудово працює. Щось повинно бути не так, тому що все не повинно бути таким простим.


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

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

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

Введіть пароль і спробуйте отримати доступ до нього чи ні. Для мене це не працювало. Оскільки це контейнер Docker, я вирішив перезапустити свій робочий стіл Docker, щоб зробити це правою кнопкою миші на піктограмі докера на панелі завдань і натиснути перезапустити.

Після перезавантаження Docker я зміг увійти та побачити Базу даних, а також помилка була знищена під час перезавантаження програми у Visual Studio .

Сподіваюся, це допомагає.


0

це може бути через проблеми з авторизацією; це було для мене. Якщо у вас є, наприклад: [Authorize("WriteAccess")]або [Authorize("ReadAccess")]вгорі функцій контролера, спробуйте прокоментувати їх.


0

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

Процес "Сервіс MongoDB" не запускався в Сервісах

Запустіть cmd як адміністратор та введіть,

net start MongoDB

Тільки щоб побачити, що MongoDB працює і працює просто введіть монго, в cmd він дасть детальну інформацію про версію Mongo та URL-адресу підключення Mongo.


0

Я просто зіткнувся з цим прямо зараз ...

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

Тут, на моєму кінці, у мене є два відокремлених рішення Visual Studio (.sln) ... відкриті кожне у власному екземплярі Visual Studio.

Рішення 2 викликає код рішення 1. Проблема була пов'язана з портом, призначеним для Рішення 1. Мені довелося змінити порт рішення 1 на інший, і тоді Рішення 2 почало працювати знову. Тому не забудьте перевірити порт, призначений вашому проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.