ActionResult<T> 會將 StatusCode 設為 200

在將傳回型別宣告為 ActionResult<TValue> 的 MVC/API 控制器動作中傳回 T 時,ObjectResult.StatusCode 一律會將設定為 200,TProblemDetails 的情況除外。

這項變更可能會導致某些手動設定狀態碼的案例出現預期外的行為,因為先前 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 控制器動作

另請參閱