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

Иногда я получаю следующую ошибку, когда я делал 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();

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Из статьи возможны возможные причины:

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

Обратите внимание: http://coding-issues.blogspot.in/2012/11/no-connection-could-be-made-because.html

Ответ 6

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

Ответ 7

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

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

            return "null";
        }

    }

Ответ 8

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

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

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

Ответ 9

Ну, я впервые получил эту ошибку на 64-битной Windows 8 в первый раз, и оказалось, что my.ini был reset, а файл 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, это установка Native Instruments Traktor 2 и звуковой платы Traktor Audio 2, которая действительно не должна была вызывать эту проблему, и никто другой не использовал эту систему помимо меня. Если у кого-то есть ключ, вам будет некогда прокомментировать, чтобы предотвратить это для меня и для всех, кто столкнулся с этим.

Ответ 10

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

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Служба обмена портами Net.Tcp

Ответ 11

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

  • Перезагрузите рабочую станцию ​​

  • Восстановите свое решение

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

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

Ответ 12

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

Ответ 13

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

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

Ответ 14

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

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

Ответ 15

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

  • App1
  • App2

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

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

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

Ответ 16

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

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

Ответ 17

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

Ответ 18

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

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

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

Ответ 19

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

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

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

Ответ 20

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

Ответ 21

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

Ответ 22

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

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

Ответ 23

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

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

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

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

Ответ 24

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

enter image description here

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

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

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