MVC 在模型繫結中偵測空的主體的方式已變更

在 MVC 模型繫結期間偵測空的要求本文的機制現在使用 IHttpRequestBodyDetectionFeature.CanHaveBody, 此屬性設定為:

  • true

    • 針對具有非零 Content-Length 要求標頭或 Transfer-Encoding: chunked 要求標頭的 HTTP/1.x 要求。
    • 針對未於初始標頭框架中設定 END_STREAM 旗標的 HTTP/2 要求。
  • false

    • 針對沒有 Content-LengthTransfer-Encoding: chunked 要求標頭的 HTTP/1.x 要求,或 Content-Length 要求標頭為 0 時。
    • 針對要求標頭為 Connection: UpgradeHTTP/1.x 要求,例如 WebSocket 要求。 這類要求沒有 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.CanHaveBodyfalse,則系統不會嘗試還原序列化。 下列範例 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 控制器動作