Fehlermeldung
Cannot determine the frame size or a corrupted frame was received.
Auch ausgegeben als
- System.Security.Authentication.AuthenticationException: Cannot determine the frame size or a corrupted frame was received.
Derselbe Text in .NET Core, .NET 5–10 und .NET Framework. HttpClient verpackt den Fehler in „The SSL connection could not be established, see inner exception.“
.NET SslStream / HttpClient — AuthenticationException when the peer's reply is not a TLS record
Was der Fehler bedeutet
SslStream hat den Header eines TLS-Records erwartet und Bytes bekommen, die keinen solchen Header bilden, deshalb kann es nicht einmal feststellen, wie lang der nächste Frame ist. Die Gegenstelle spricht auf diesem Port kein TLS – typischerweise ein Endpunkt mit reinem HTTP („HTTP/1.1 400 …“), der über https:// angesprochen wird, oder ein Protokoll, das im Klartext beginnt.
Warum der Fehler auftritt
https:// an einen Port mit reinem HTTP
häufigDer HTTP-Port eines Dienstes (oder ein Sidecar-, Metrik- oder Health-Port) wird über eine URL mit https:// aufgerufen.
Kestrel lauscht auf dem verwendeten Port mit HTTP
häufiglaunchSettings.json oder ASPNETCORE_URLS konfiguriert http:// auf dem Port, den der Client als HTTPS behandelt – eine häufige Verwechslung zwischen den Entwicklungsports 5xxx und 7xxx.
Ein Proxy ohne TLS, als TLS-Proxy eingetragen
gelegentlichEine Proxyadresse mit https:// für einen Proxy, der von Clients nur reines HTTP annimmt.
So behebst du den Fehler
- 1.
Prüfen, welches Protokoll der Port spricht
Antwortet reines HTTP, verwende den HTTPS-Port oder http://.
bash curl -si http://api.example.com:8080/ | head -1 # answers over plain HTTP? - 2.
HTTPS-URL verwenden, auf der Kestrel lauscht
Prüfe applicationUrl oder ASPNETCORE_URLS und rufe die https://-Adresse mit ihrem Port auf.
json { "profiles": { "https": { "commandName": "Project", "applicationUrl": "https://localhost:7001;http://localhost:5001" } } } - 3.
E-Mail: STARTTLS-Ports brauchen STARTTLS
Verwende mit MailKit SecureSocketOptions.StartTls auf Port 587 und SslOnConnect nur auf Port 465.
csharp // MailKit: STARTTLS on 587, implicit TLS (SslOnConnect) on 465 await smtp.ConnectAsync("mail.example.com", 587, MailKit.Security.SecureSocketOptions.StartTls);