Сбой создания библиотеки DLL с помощью «Существующее соединение было принудительно закрыто удаленным хостом» - PullRequest
0 голосов
/ 28 апреля 2020

Я создал DLL [доступный как пакет NuGet (.NetStandard 2.0 / 2.1)].

Когда создается экземпляр определенного класса в этой DLL, мы запускаем синхронный вызов GET для. Net Базового WebAPI, установленного на IIS на моем локальном компьютере (localhost), для загрузки некоторых данных конфигурации.

Эта DLL-библиотека использует одноэлементный HttpClient (здесь мы следуем «рекомендациям» Microsoft)

Factory.SingletonHttpClient().GetAsync(args.Uri).GetAwaiter().GetResult();

Я использовал этот пакет NuGet в целом ряде приложений, все из которых построены с использованием *. 1020 * Framework 4.7.2, и они работают просто отлично - данные успешно извлекаются из WebAPI.

Однако .... У меня есть одно конкретное приложение (опять-таки, 4.7.2), в котором GET постоянно дает сбой сообщение об ошибке:

System. Net .Sockets.SocketException HResult = 0x80004005 Сообщение = Существующее соединение было принудительно закрыто удаленным хостом

Это исключение было первоначально выброшено на этом стек вызовов: System. Net .Sockets.Socket.BeginReceive (byte [], int, int, System. Net .Sockets.SocketFlags, System.AsyncCallback, object)

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

1 Ответ

0 голосов
/ 29 апреля 2020

Так что я нашел ответ, но я смущен им.

Я использую последнюю версию Windows 10 (версия 1909). Все мои приложения используют. Net 4.7.2

Поэтому, когда я отлаживаю все эти приложения. NET 4.7.2 на моей машине, они все делают вызов WebAPI на моем IIS LocalHost, кроме это одно приложение.

Когда я смотрю на ServicePointManager.SecurityProtocol в этом сбойном приложении, я вижу, что оно работает с устаревшими значениями SSL и TLS. Почему это относится к этому приложению, а не к другим? Нигде не предусмотрено использование этих устаревших протоколов, так почему же они используются, а не другими приложениями?

Я исправил это, внеся изменения в мою библиотеку NuGet DLL, чтобы добавить TLS1.2 в любые используемые версии TLS:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | ServicePointManager.SecurityProtocol;
...