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.

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

Consulte también