ActionResult<T> 會將 StatusCode 設為 200
在將傳回型別宣告為 ActionResult<TValue> 的 MVC/API 控制器動作中傳回 T
時,ObjectResult.StatusCode 一律會將設定為 200,T
為 ProblemDetails 的情況除外。
這項變更可能會導致某些手動設定狀態碼的案例出現預期外的行為,因為先前 ObjectResult.StatusCode 曾是 null
。 此外,如果動作篩選預期為 Null 值而不是 200,動作篩選可能會受到此變更的影響。
導入的版本
ASP.NET Core 6.0
先前的行為
先前,控制器動作會傳回 T
,並設定 Response.StatusCode
手動產生指定回應狀態碼。 例如,下列控制器的動作會產生 202 Accepted
回應。
// Generates a 202 Accepted response
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
新的行為
現在,相同控制器動作會傳回 T
,並設定 Response.StatusCode
一律產生 200 OK
回應。
// Generates a 200 OK response
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
中斷性變更的類型
此變更可能會影響來源相容性。
變更原因
傳回 200 OK
的狀態碼是從 ASP.NET Core 3.1 起開始記載。 不過,其會將 StatusCode 保留為 null
,且最終只會因為其為預設值而產生 200 OK
回應。 由於預設的內部行為可能會變更,因此我們決定避免依賴預設值,明確地將 StatusCode 設定為預期的 200 OK
。
建議的動作
如果您的程式碼會手動設定狀態碼,而且因這項變更而中斷,您必須變更控制器動作。 例如,下列程式碼片段會設定狀態碼 202,且因這項變更而中斷。
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
若要保留 202 狀態碼的預期行為,下列程式碼片段會展示一些選項。
public ActionResult<Model> Get()
{
return Accepted(new Model());
}
// or
public ActionResult<Model> Get()
{
return StatusCode(StatusCodes.Status202Accepted, new Model());
}
// or
public Model Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
受影響的 API
- MVC/API 控制器動作