net 5.0 Невозможно определить размер кадра или получен поврежденный кадр

Я хочу попробовать net5.0, так как он находится в rc2, и я столкнулся со странной проблемой.

Я создал WebApi по умолчанию в net5.0. Я ничего не трогал, я просто нажимал «запустить» (в пустельге, а не в ISS), и появляется домашняя страница Swagger. Я попробовал получить WeatherForcast, и все работает нормально.

Индексная страница Swagger

затем я создал консольное приложение в NET5.0 и добавил этот код:

static async Task Main(string[] args)
{
    var clientHandler = new HttpClientHandler
    {
        ServerCertificateCustomValidationCallback = (_, _, _, _) => true
    };
    var client = new HttpClient(clientHandler);
    try
    {
        var httpMessage = await client.GetAsync("https://localhost:5001/WeatherForecast");
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

и с этим кодом я получил следующую ошибку:

System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
---> System.IO.IOException: Cannot determine the frame size or a corrupted frame was received.

после этого я попробовал на Почтальоне тот же запрос, и он сработал (как от чванства). Моим последним тестом было переключить консольное приложение на netcore 3.1, и запрос сработал.

Таким образом, я получил эту ошибку только в приложении net5.0.

Какие-либо предложения ?

РЕДАКТИРОВАТЬ:

  • Вот информация о моем компьютере: W10 Enterprise, V 1809, Build 17763.1518.
  • Я получил ошибку только на консоли Net5.0.

person Thibaud    schedule 30.10.2020    source источник
comment
Как заголовок вашего вопроса связан с его содержанием?   -  person Pavel Anikhouski    schedule 30.10.2020
comment
Пожалуйста, не используйте .GetAwaiter().GetResult(). Асинхронный код является асинхронным по какой-то причине, не пытайтесь заставить его работать синхронно.   -  person Ian Kemp    schedule 30.10.2020
comment
Вы говорите, что вызов метода веб-API https://localhost:5001/WeatherForecast only завершился неудачно при вызове из консольного приложения .NET 5 и преуспел в .NET Core 3.1 / Swagger / Postman?   -  person Ian Kemp    schedule 30.10.2020
comment
Я предполагаю, что вы нажимаете github.com/dotnet/runtime/issues/1720 - это помечено как исправленное с кодом, объединенным для его исправления, но не знаю, вошло ли это исправление в RC2. Также было бы полезно, если бы вы указали, какую ОС и версию вы используете.   -  person Ian Kemp    schedule 30.10.2020
comment
Да, звонок идет только через консоль net5. И да, обычно я не использую GetAwaiter (). GetResult () ...   -  person Thibaud    schedule 31.10.2020
comment
Я предполагаю, что вы используете свой сервер без TLS, но пытаетесь подключиться с помощью https. Удалите http. И да, как сказал @IanKemp выше, пожалуйста, узнайте об асинхронном программировании и потоковой передаче правильно.   -  person James Mallon    schedule 28.01.2021


Ответы (1)


Пустельга используется для принудительного выбора Tls 1.1 или Tls 1.2. Начиная с .Net 5.0 Preview 6, он был изменен на None, что означает значение ОС по умолчанию. Поддержка Tls по умолчанию для Kestrel

Так совпало, что в прошлом году Microsoft начала включать Tls 1.3 по умолчанию в Windows 10. Windows 10 Tls 1.3 включен по умолчанию Следовательно, ваше приложение, вероятно, теперь использует Tls 1.3, что, как я обнаружил, иногда вызывает проблемы.

Чтобы настроить Tls 1.3 на отключение по умолчанию (то есть доступное для приложений, которые его запрашивают, но отключение в противном случае), в вашем реестре перейдите или создайте этот путь:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ Protocols \ TLS 1.3 \ Client

И установите или создайте DWORD с именем DisabledByDefault равным 1.

Это должно заставить ваш браузер работать с Tls 1.2.

Аналогично для вашего сервера Kestrel:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ Protocols \ TLS 1.3 \ Server

Также там установите или создайте DWORD с именем DisabledByDefault равным 1.

Если этого не произойдет, то и под клиентом, и под сервером также создайте DWORD с именем Enabled, установленным в 0. Это полностью отключит Tls 1.3.

person user6604437    schedule 21.04.2021
comment
Это было то! Спасибо большое =) - person Thibaud; 23.04.2021