ActionResult<T> で StatusCode が 200 に設定される

戻り値の型が ActionResult<TValue> と宣言されている MVC/API コントローラー アクションで T を返すと、TProblemDetails である場合を除き、ObjectResult.StatusCode は常に 200 に設定されます。

以前は ObjectResult.StatusCodenull であったため、この変更により、状態コードを手動で設定しているシナリオで、予期しない動作が発生する可能性があります。 また、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 以降のドキュメントに記載されています。 ただし、StatusCodenull のままになっており、最終的に 200 OK 応答が生成されるのはそれが既定であるためだけです。 既定の内部動作は変更される可能性があるため、既定値には依存しないことにして、予期される 200 OKStatusCode を明示的に設定することに決定しました。

コードで状態コードを手動で設定しており、この変更によって破壊された場合は、コントローラー アクションを変更する必要があります。 たとえば、次のコード スニペットは 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 コントローラーのアクション

こちらもご覧ください