MVC 在模型繫結中偵測空的主體的方式已變更
在 MVC 模型繫結期間偵測空的要求本文的機制現在使用 IHttpRequestBodyDetectionFeature.CanHaveBody, 此屬性設定為:
true
:- 針對具有非零
Content-Length
要求標頭或Transfer-Encoding: chunked
要求標頭的HTTP/1.x
要求。 - 針對未於初始標頭框架中設定
END_STREAM
旗標的HTTP/2
要求。
- 針對具有非零
false
:- 針對沒有
Content-Length
或Transfer-Encoding: chunked
要求標頭的HTTP/1.x
要求,或Content-Length
要求標頭為0
時。 - 針對要求標頭為
Connection: Upgrade
的HTTP/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.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 控制器動作