Wykrywanie pustej treści wzorca MVC w powiązaniu modelu uległo zmianie
Mechanizm wykrywania pustej treści żądania podczas powiązania modelu MVC używa teraz elementu IHttpRequestBodyDetectionFeature.CanHaveBody. Ta właściwość jest ustawiona na:
true
:- W przypadku
HTTP/1.x
żądań z nagłówkiem żądania innego niż zeroContent-Length
lub nagłówkiemTransfer-Encoding: chunked
żądania. - W przypadku
HTTP/2
żądań, które nie ustawiają flagiEND_STREAM
w ramce początkowego nagłówka.
- W przypadku
false
:- W przypadku
HTTP/1.x
żądań bezContent-Length
nagłówków żądań lubTransfer-Encoding: chunked
jeśliContent-Length
nagłówek żądania to0
. - W przypadku
HTTP/1.x
żądań z nagłówkiemConnection: Upgrade
żądania, na przykład w przypadku żądań protokołu WebSocket. Nie ma treści żądania HTTP dla takich żądań, więc żadne dane nie powinny być odbierane do czasu uaktualnienia. - W przypadku
HTTP/2
żądań, które ustawiają flagęEND_STREAM
w ramce początkowego nagłówka.
- W przypadku
Poprzednie zachowanie przeprowadziło minimalną walidację elementu Content-Length = 0
. W niektórych scenariuszach, gdy żądania nie zawierają wszystkich wymaganych nagłówków i flag HTTP, treść żądań może być teraz wykrywana jako pusta treść i zgłaszać błąd klienta.
Wprowadzona wersja
ASP.NET Core 7.0
Poprzednie zachowanie
Jeśli akcja kontrolera wiąże parametr z treści żądania, a żądanie klienta nie zawiera Content-Length
nagłówka żądania, struktura zgłasza wyjątek wewnętrzny podczas deserializacji treści żądania. Na przykład System.Text.Json
formater danych wejściowych oparty na protokole zgłasza wyjątek podobny do następującego:
System.Text.Json.JsonException: 'The input does not contain any JSON tokens.
Expected the input to start with a valid JSON token, when isFinalBlock is true.
Path: $ | LineNumber: 0 | BytePositionInLine: 0.'
Poniższy przykładowy kod JSON przedstawia poprzedni wyjątek sformatowany jako ProblemDetails odpowiedź:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-34e98b5841b88bfb5476965efd9d9c8c-5bb16bc50dfbabb7-00",
"errors": {
"$": [
"The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. Path: $ | LineNumber: 0 | BytePositionInLine: 0."
],
"value": [
"The value field is required."
]
}
}
Nowe zachowanie
Deserializacja nie jest już podejmowana, jeśli IHttpRequestBodyDetectionFeature.CanHaveBody ma wartość false
. Poniższa przykładowa ProblemDetails odpowiedź pokazuje, jak komunikat o błędzie zwrócony do klientów wskazuje, że treść żądania jest pusta:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-0f87920dc675fdfdf8d7638d3be66577-bd6bdbf32d21b714-00",
"errors": {
"": [
"A non-empty request body is required."
],
"value": [
"The value field is required."
]
}
}
Typ zmiany powodującej niezgodność
Ta zmiana ma wpływ na zgodność binarną.
Przyczyna wprowadzenia zmiany
Aby dopasować się do innych części struktury, które używają IHttpRequestBodyDetectionFeature.CanHaveBody polecenia i naprawić opcjonalne [FromBody]
powiązanie modelu, nie działa (dotnet/aspnetcore #29570).
Zalecana akcja
Nie są wymagane żadne zmiany. Jeśli jednak widzisz nieoczekiwane zachowanie, upewnij się, że żądania klientów wysyłają odpowiednie nagłówki HTTP.
Dotyczy interfejsów API
Akcje kontrolera MVC