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 控制器操作