Compartir a través de


ActionResult<T> establece StatusCode en 200

Al devolver un T en una acción del controlador MVC/API que declara el tipo de valor devuelto como ActionResult<TValue>, el ObjectResult.StatusCode siempre se establece en 200, excepto cuando el T es un ProblemDetails.

Este cambio puede provocar un comportamiento inesperado en algunos escenarios en los que se establece manualmente el código de estado, ya que anteriormente 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

Anteriormente, la acción de un controlador que devuelve T y establece Response.StatusCode genera manualmente el código de estado de respuesta especificado. Por ejemplo, la acción del controlador siguiente generará una 202 Accepted respuesta.

// Generates a 202 Accepted response
public ActionResult<Model> Get()
{
    Response.StatusCode = StatusCodes.Status202Accepted;
    return new Model();
}

Nuevo comportamiento

Ahora, la misma acción del controlador que devuelve T y establece manualmente Response.StatusCode siempre genera una 200 OK respuesta.

// Generates a 200 OK response
public ActionResult<Model> Get()
{
    Response.StatusCode = StatusCodes.Status202Accepted;
    return new Model();
}

Tipo de cambio disruptivo

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, se mantiene StatusCode como null y, finalmente, genera una 200 OK respuesta solo porque es el valor predeterminado. Dado que el comportamiento interno predeterminado podría cambiar, decidimos evitar confiar en el valor predeterminado y establecer StatusCode explícitamente en el esperado 200 OK.

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 y se interrumpe con este cambio.

public ActionResult<Model> Get()
{
    Response.StatusCode = StatusCodes.Status202Accepted;
    return new Model();
}

Para conservar el comportamiento deseado de un código de estado 202, los fragmentos de código siguientes muestran 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();
}

Las APIs afectadas

  • Acciones del controlador de MVC/API

Consulte también