MVC의 모델 바인딩에서 빈 본문 검색이 변경됨

MVC 모델 바인딩 중에 빈 요청 본문을 검색하는 메커니즘은 이제 IHttpRequestBodyDetectionFeature.CanHaveBody을(를) 사용합니다. 이 속성은 다음으로 설정됩니다.

  • true:

    • 0이 아닌 Content-Length 요청 헤더 또는 Transfer-Encoding: chunked 요청 헤더가 있는 HTTP/1.x 요청의 경우.
    • 초기 헤더의 프레임에 END_STREAM 플래그를 설정하지 않은 HTTP/2 요청의 경우.
  • false:

    • Content-Length 또는 Transfer-Encoding: chunked 요청 헤더가 없는 HTTP/1.x 요청의 경우 또는 Content-Length 요청 헤더가 0입니다.
    • WebSockets 요청과 같이 Connection: Upgrade 요청 헤더가 있는 HTTP/1.x 요청의 경우. 이러한 요청에 대한 HTTP 요청 본문이 없으므로 업그레이드 후까지 데이터를 수신해서는 안 됩니다.
    • 초기 헤더의 프레임에서 END_STREAM 플래그를 설정하는 HTTP/2 요청의 경우.

이전 동작은 Content-Length = 0의 최소 유효성 검사를 수행했습니다. 일부 시나리오에서는 요청에 필요한 모든 HTTP 헤더 및 플래그가 포함되지 않은 경우 이제 요청 본문이 빈 본문이 있는 것으로 감지되고 클라이언트에 오류를 보고할 수 있습니다.

도입된 버전

ASP.NET Core 7.0

이전 동작

컨트롤러 작업이 요청 본문의 매개 변수를 바인딩하고 클라이언트 요청에 Content-Length 요청 헤더가 포함되지 않은 경우 프레임워크는 요청 본문을 역직렬화하는 동안 내부 예외를 반환합니다. 예를 들어 System.Text.Json 기반 입력 포맷터는 다음과 유사한 예외를 반환합니다.

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.'

다음 예제 JSON은 ProblemDetails 응답으로 형식이 지정된 이전 예외를 보여줍니다.

{
  "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."
    ]
  }
}

새 동작

IHttpRequestBodyDetectionFeature.CanHaveBody이(가) false인 경우 역직렬화는 더 이상 시도되지 않습니다. 다음 예제 ProblemDetails 응답은 클라이언트에 반환된 오류 메시지가 요청 본문이 비어 있음을 나타내는 방법을 보여 줍니다.

{
  "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."
    ]
  }
}

호환성이 손상되는 변경의 형식

이 변경 내용은 이진 호환성에 영향을 미칩니다.

변경 이유

IHttpRequestBodyDetectionFeature.CanHaveBody을(를) 사용하는 프레임워크의 다른 부분과 정렬하고 선택적 [FromBody] 모델 바인딩이 작동하지 않는 문제를 해결하려면(dotnet/aspnetcore #29570).

변경할 필요가 없습니다. 그러나 예기치 않은 동작이 표시되는 경우 클라이언트 요청이 적절한 HTTP 헤더를 보내는지 확인합니다.

영향을 받는 API

MVC 컨트롤러 작업