Сообщение об ошибке
Cannot determine the frame size or a corrupted frame was received.
Также выводится как
- System.Security.Authentication.AuthenticationException: Cannot determine the frame size or a corrupted frame was received.
Тот же текст в .NET Core, .NET 5–10 и .NET Framework. HttpClient оборачивает его в «The SSL connection could not be established, see inner exception.»
.NET SslStream / HttpClient — AuthenticationException when the peer's reply is not a TLS record
Что это означает
SslStream ожидал заголовок записи TLS, а получил байты, которые его не образуют, поэтому не может даже определить длину следующего фрейма. Другая сторона на этом порту не использует TLS: обычно это эндпоинт с обычным HTTP («HTTP/1.1 400 …»), к которому обратились по https://, или протокол, сеанс которого начинается без шифрования.
Почему это происходит
https:// на порту с обычным HTTP
частоОбращение по URL с https:// к HTTP-порту сервиса (или к порту sidecar-контейнера, метрик или проверки работоспособности).
Kestrel принимает HTTP на порту, к которому вы обращаетесь
частоlaunchSettings.json или ASPNETCORE_URLS задают http:// для порта, который клиент считает HTTPS-портом, — частая путаница между портами разработки 5xxx и 7xxx.
Обычный прокси настроен как TLS-прокси
иногдаАдрес прокси указан с https://, хотя прокси принимает от клиентов только обычный HTTP.
Как исправить
- 1.
Проверьте, какой протокол работает на порту
Если отвечает обычный HTTP, используйте HTTPS-порт или http://.
bash curl -si http://api.example.com:8080/ | head -1 # answers over plain HTTP? - 2.
Используйте URL с HTTPS, который слушает Kestrel
Проверьте applicationUrl или ASPNETCORE_URLS и обращайтесь по адресу https:// с указанным там портом.
json { "profiles": { "https": { "commandName": "Project", "applicationUrl": "https://localhost:7001;http://localhost:5001" } } } - 3.
Почта: на портах STARTTLS нужен STARTTLS
В MailKit используйте SecureSocketOptions.StartTls на порту 587, а SslOnConnect — только на 465.
csharp // MailKit: STARTTLS on 587, implicit TLS (SslOnConnect) on 465 await smtp.ConnectAsync("mail.example.com", 587, MailKit.Security.SecureSocketOptions.StartTls);