ActionResult<T> で StatusCode が 200 に設定される
戻り値の型が ActionResult<TValue> と宣言されている MVC/API コントローラー アクションで T
を返すと、T
が ProblemDetails である場合を除き、ObjectResult.StatusCode は常に 200 に設定されます。
以前は ObjectResult.StatusCode は null
であったため、この変更により、状態コードを手動で設定しているシナリオで、予期しない動作が発生する可能性があります。 また、200 ではなく null 値を想定しているアクション フィルターは、この変更によって影響を受ける可能性があります。
導入されたバージョン
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
応答が生成されるのはそれが既定であるためだけです。 既定の内部動作は変更される可能性があるため、既定値には依存しないことにして、予期される 200 OK
に StatusCode を明示的に設定することに決定しました。
推奨アクション
コードで状態コードを手動で設定しており、この変更によって破壊された場合は、コントローラー アクションを変更する必要があります。 たとえば、次のコード スニペットは 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 コントローラーのアクション
こちらもご覧ください
.NET