MSDN.WhiteKnight - Stack Overflow answers
Ответ на "HttpClient дает разный результат при использование .net и .net core"
Answer 1146198
Поведение в .NET Core в данном случае отличается из-за того, что в нем установка свойства ServicePointManager.SecurityProtocol вообще не оказывает влияния на HttpClient (оно влияет только на HttpWebRequest, а HttpClient использует другие компоненты - в последних версиях это SocketsHttpHandler). К сожалению, это официально не документировано, но вот сообщение от разработчиков NCL на Github: https://github.com/dotnet/runtime/issues/26048
In .NET Core, ServicePointManager affects only HttpWebRequest. It does not affect HttpClient.
В случае установки Ssl3 ваш тест падает с ошибкой еще на этапе проверки допустимых протоколов при установке свойства - см. исходники ServicePointManager.ValidateSecurityProtocol:
private static void ValidateSecurityProtocol(SecurityProtocolType value) { const SecurityProtocolType Allowed = #pragma warning disable CA5364 // Do Not Use Deprecated Security Protocols SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | #pragma warning restore CA5364 SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; if ((value & ~Allowed) != 0) { throw new NotSupportedException(SR.net_securityprotocolnotsupported); } }
На дальнейшую работу HttpClient оно не влияет (используется SystemDefault), что и дает однотипный результат "ОК" на Windows 10 во всех тестах. На Win7 ошибки происходят из-за того, что протокол по умолчанию более старый и может не поддерживаться некоторыми серверами, или вызывать больше времени на согласование параметров подключения, создавая большую нагрузку на сервер. Задать протокол в .NET Core, теоретически, можно как-то так:
SocketsHttpHandler httpHandler = new SocketsHttpHandler(); httpHandler.SslOptions.EnabledSslProtocols = SslProtocols.Tls12; HttpClient client = new HttpClient(httpHandler);
Но прошивать в коде версию протокола не рекомендуется, так как это создает потенциальную дыру в безопасности на будущее, когда в этом протоколе могут найти уязвимость. Правильное решение этой проблемы я уже описал в другом вопросе: Проблемы при получение доступа к AppCenter distribute - нужно использовать протокол по умолчанию и подправить настройки реестра, чтобы использовался как можно более новый протокол для данной ОС.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.