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

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

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();

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

Ответы [ 15 ]

0 голосов
/ 29 марта 2019

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

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

и

ReadResponse () не удалось: серверне вернул полный ответ на этот запрос.Сервер вернул 0 байт.

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

0 голосов
/ 14 марта 2019

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

0 голосов
/ 18 декабря 2018

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

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

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

services.AddScoped(provider => new CfDbContext(builder.Options));
0 голосов
/ 24 августа 2018

У нас была очень похожая проблема, когда веб-сайт клиента пытался подключиться к нашей службе Web 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 голосов
/ 11 сентября 2014

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

...