ActionResult<T> establece StatusCode en 200
Al devolver T
en una acción del controlador de MVC/API que declara el tipo de valor devuelto como ActionResult<TValue>, ObjectResult.StatusCode siempre se establece en 200, excepto cuando T
es ProblemDetails.
Este cambio puede provocar un comportamiento inesperado en algunos escenarios en los que se establece el código de estado manualmente, ya que antes ObjectResult.StatusCode era null
. Además, un filtro de acción podría verse afectado por este cambio si espera un valor null en lugar de 200.
Versión introducida
ASP.NET Core 6.0
Comportamiento anterior
Antes, la acción de un controlador que devuelve T
y establece Response.StatusCode
manualmente generaba el código de estado de respuesta especificado. Por ejemplo, la siguiente acción del controlador generará una respuesta 202 Accepted
.
// Generates a 202 Accepted response
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
Comportamiento nuevo
Ahora, la misma acción del controlador que devuelve T
y establece Response.StatusCode
manualmente siempre genera una respuesta 200 OK
.
// Generates a 200 OK response
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
Tipo de cambio importante
Este cambio puede afectar a la compatibilidad de orígenes.
Motivo del cambio
La devolución de un código de estado de 200 OK
se documenta desde ASP.NET Core 3.1. Sin embargo, mantiene StatusCode como null
y al final genera una respuesta 200 OK
solo porque es el valor predeterminado. Dado que el comportamiento interno predeterminado podría cambiar, decidimos no depender de él y establecer StatusCode explícitamente en el valor 200 OK
esperado.
Acción recomendada
Si el código establece el código de estado manualmente y se interrumpe con este cambio, deberá cambiar la acción del controlador. Por ejemplo, el siguiente fragmento de código establece un código de estado de 202, que se interrumpe debido al cambio.
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
Para mantener el comportamiento deseado de un código de estado 202, los fragmentos de código siguientes dan algunas opciones.
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 afectadas
- Acciones del controlador de MVC/API