Udostępnij za pośrednictwem


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ż zero Content-Length lub nagłówkiem Transfer-Encoding: chunked żądania.
    • W przypadku HTTP/2 żądań, które nie ustawiają flagi END_STREAM w ramce początkowego nagłówka.
  • false:

    • W przypadku HTTP/1.x żądań bez Content-Length nagłówków żądań lub Transfer-Encoding: chunked jeśli Content-Length nagłówek żądania to 0.
    • W przypadku HTTP/1.x żądań z nagłówkiem Connection: 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.

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.Jsonformater 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).

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