it-swarm.com.ru

Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом

У меня есть серверное приложение, и иногда, когда клиент пытается подключиться, я получаю следующую ошибку: 

enter image description here

ПРИМЕЧАНИЕ: «Не удалось получить поток от клиента или не удалось войти в систему» ​​- это текст, который я добавил в оператор catch

и строка, на которой он останавливается (sThread: строка 96): 

tcpClient = (TcpClient)client;
clientStream = tcpClient.GetStream();
sr = new StreamReader(clientStream);
sw = new StreamWriter(clientStream);

// line 96:                 
a = sr.ReadLine();

Что может быть причиной этой проблемы? Обратите внимание, что это не происходит все время

65
Alex

Эта ошибка обычно означает, что целевой компьютер работает, но служба, к которой вы пытаетесь подключиться, недоступна. (Либо он остановился, либо вышел из строя, либо занят другим запросом.)

На английском языке: Соединение с machine (удаленным хостом/сервером/ПК, на котором запущена служба) выполнено, но поскольку служба не была доступна на этой машине, машина не знать, что делать с запросом.

Если подключение к машине было недоступно, вы увидите другую ошибку. Я забываю, что это такое, но это похоже на «Служба недоступна» или «Недоступен».

Редактировать - добавлено

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

41
David

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

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Правка

System.Net.ServicePointManager.SecurityProtocol - Это свойство выбирает версию Secure Sockets Layer (SSL) или Transport Протокол уровня безопасности (TLS) для использования для новых соединений, которые используют Только схема защищенного протокола передачи гипертекста (HTTPS); существующий соединения не изменены.

Я полагаю, что конфигурация SecurityProtocol важна во время рукопожатия TLS при выборе версии протокола. 

TLS handshake - Этот протокол используется для обмена всей информацией, необходимой обеим сторонам для обмена фактическими данными приложения по TLS.

ClientHello - клиент отправляет сообщение ClientHello, указывающее самую высокую версию протокола TLS, которую он поддерживает ...

ServerHello - сервер отвечает сообщением ServerHello, содержащим выбранную версию протокола ... Выбранная версия протокола должна быть самой высокой, которую поддерживают и клиент, и сервер. Например, если клиент поддерживает версию 1.1 TLS, а сервер поддерживает версию 1.2, следует выбрать версию 1.1; Версия 1.2 не должна быть выбрана.

107
Hans Vonn

Мой конкретный сценарий состоял в том, что для службы приложений Azure минимальная версия TLS была изменена на 1.2

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

Вы можете получить доступ к настройке внутри «Настройки SSL».

18
Hugo Hilário

Не уверен, какие из исправлений в этих сообщениях блога помогли, но один из них решил эту проблему для меня ...

http://briancaos.wordpress.com/2012/07/06/unable-to-read-data-from-the-transport-connection-the-connection-was-closed/

Хитрость, которая помогла мне, - это выйти из WebRequest и использовать вместо него HttpWebRequest. HttpWebRequest позволяет мне играть с 3 важными настройками:

а также

http://briancaos.wordpress.com/2012/06/15/an-existing-connection-was-forcbly-closed-by-the-remote-Host/

  • ШАГ 1: Отключить KeepAlive 
  • ШАГ 2: Установите ProtocolVersion на Version10
  • ШАГ 3: Ограничение количества точек обслуживания
13
SteveC

При вызовах служб HTTPS с одного из наших серверов также выдается сообщение « Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто », исключение. HTTP-сервис работал нормально. Использовал Wireshark, чтобы увидеть, что это был сбой TLS. Закончилось тем, что комплект шифров на сервере нужно было обновить. 

7
Jobrocol

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

Я клонировал VM и запустил его в другой сети с новым IP-адресом, но не изменил привязки в IIS. Fiddler показывал мне «Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом», а IE говорил мне «Включите TLS 1.0, TLS 1.1 и TLS 1.2 в дополнительных настройках» , Изменение привязки к новому IP-адресу решило это для меня.

3
Jon.Mozley

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

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

На клиенте вы должны написать свой код, чтобы учесть возможность сбоя сервера в любое время. Так оно и есть: сетевые соединения изначально ненадежны.

2
Jim Mischel

Я получил эту проблему в прошлом. Я использую PostgreSQL и когда я запускаю свою программу, иногда она подключается, а иногда выдает такую ​​ошибку.

Когда я экспериментирую с моим кодом, я помещаю код подключения в самую первую строку под общедоступной формой. Вот пример:

ДО:

    public Form1()
        {
        //HERE LIES SOME CODES FOR RESIZING MY CONTROLS DURING RUNTIME
        //CODE
        //CODE AGAIN
        //ANOTHER CODE
        //CODE NA NAMAN
        //CODE PA RIN!





        //Connect to Database to generate auto number
        NpgsqlConnection iConnect = new NpgsqlConnection("Server=localhost;Port=5432;User ID=postgres;Password=pass;Database=DB");
        iConnect.Open();
        NpgsqlCommand iQuery = new NpgsqlCommand("Select * from table1", iConnect);
        NpgsqlDataReader iRead = iQuery.ExecuteReader();
        NpgsqlDataAdapter iAdapter = new NpgsqlDataAdapter(iQuery);

        DataSet iDataSet = new DataSet();
        iAdapter.Fill(iDataSet, "ID");

        MessageBox.Show(iDataSet.Tables["ID"].Rows.Count.ToString());
        }

СЕЙЧАС:

    public Form1()
        {
        //Connect to Database to generate auto number
        NpgsqlConnection iConnect = new NpgsqlConnection("Server=localhost;Port=5432;User ID=postgres;Password=pass;Database=DB");
        iConnect.Open();
        NpgsqlCommand iQuery = new NpgsqlCommand("Select * from table1", iConnect);
        NpgsqlDataReader iRead = iQuery.ExecuteReader();
        NpgsqlDataAdapter iAdapter = new NpgsqlDataAdapter(iQuery);

        DataSet iDataSet = new DataSet();
        iAdapter.Fill(iDataSet, "ID");

        MessageBox.Show(iDataSet.Tables["ID"].Rows.Count.ToString());





        //HERE LIES SOME CODES FOR RESIZING MY CONTROLS DURING RUNTIME
        //CODE
        //CODE AGAIN
        //ANOTHER CODE
        //CODE NA NAMAN
        //CODE PA RIN!

        }

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

Удачного кодирования!

2
LoudSpeaker

Это решило мою проблему. Я добавил эту строку перед выполнением запроса:

System.Net.ServicePointManager.Expect100Continue = false;

Казалось, что на пути к серверу есть прокси, который не поддерживает 100-продолжение поведения.

1
Mahdi Ataollahi
System.Net.ServicePointManager.Expect100Continue = false;

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

1
Tahir Alvi

У меня было запущено стороннее приложение (Fiddler), чтобы попытаться увидеть отправленные запросы. Закрытие этого приложения исправило это для меня

0
Johan Aspeling

У нас была очень похожая проблема, когда веб-сайт клиента пытался подключиться к нашей службе веб-API и получал то же сообщение. Это начало происходить совершенно неожиданно, когда не было никаких изменений кода или обновлений Windows на сервере, на котором работал IIS.

В нашем случае оказалось, что вызывающий веб-сайт использует версию .Net, которая поддерживает только TLS 1.0, и по какой-то причине сервер, на котором работал наш IIS, остановился, по-видимому, прекратил принимать вызовы TLS 1.0. Чтобы диагностировать, что мы должны были явно включить TLS через реестр на сервере IIS, а затем перезапустить этот сервер. Это ключи reg:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
    1.0\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
    1.0\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
    1.1\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
    1.1\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
    1.2\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
    1.2\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

If that doesn't do it, you could also experiment with adding the entry for SSL 2.0:


    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
    "DisabledByDefault"=dword:00000000
    "Enabled"=dword:00000001

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
    "DisabledByDefault"=dword:00000000
    "Enabled"=dword:00000001

Мой ответ на еще один вопрос здесь содержит сценарий powershell, который мы использовали для добавления записей:

ПРИМЕЧАНИЕ: Включение старых протоколов безопасности не является хорошей идеей, в нашем случае правильным решением было заставить клиентский веб-сайт обновить свой код для использования TLS 1.2, но приведенные выше записи реестра могут помочь диагностировать проблему в первом случае. место.

0
tomRedox

Если у вас есть сертификат https для домена, убедитесь, что у вас есть привязка https к имени домена в IIS. В IIS -> Выберите домен -> Нажмите «Привязки». Откроется окно «Привязки сайта». Добавьте привязку для https.

0
user2147447

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

HTTPS рукопожатие [бла] (для # 136) не удалось. System.IO.IOException Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным узлом

а также

Ошибка ReadResponse (): сервер не вернул полный ответ на этот запрос. Сервер вернул 0 байт.

Проблема оказалась в том, что сертификат сервера SSL был пропущен и не был установлен на нескольких серверах.

0
deadlydog

Причина, по которой это происходило со мной, была в том, что у меня была рекурсивная зависимость в моем провайдере DI. В моем случае у меня было:

services.AddScoped(provider => new CfDbContext(builder.Options));
services.AddScoped(provider => provider.GetService<CfDbContext>());

Исправлено было просто удалить вторую сферу обслуживания регистрации

services.AddScoped(provider => new CfDbContext(builder.Options));
0
Madison Haynie