ActionResult<T> definem o StatusCode para 200

Ao devolver a T numa ação controlador MVC/API que declara o tipo de retorno como ActionResult<TValue>, o ObjectResult.StatusCode é sempre definido para 200, exceto quando o T é um ProblemDetails.

Esta alteração pode causar comportamentos inesperados em alguns cenários em que se define manualmente o código de estado, já que anteriormente o ObjectResult.StatusCode era null. Além disso, um filtro de ação pode ser afetado por esta alteração se esperar um valor nulo em vez de 200.

Versão introduzida

ASP.NET Núcleo 6.0

Comportamento anterior

Anteriormente, a ação de um controlador que retornava T e definia Response.StatusCode manualmente gerava o código de estado de resposta especificado. Por exemplo, a ação do controlador seguinte gerará uma 202 Accepted resposta.

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

Novo comportamento

Agora, a mesma ação do controlador que retorna T e define Response.StatusCode manualmente gera sempre uma 200 OK resposta.

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

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade da fonte.

Motivo da mudança

Devolver um código de estado de 200 OK está documentado a partir do ASP.NET Core 3.1. No entanto, mantém StatusCode como null, e eventualmente gera uma 200 OK resposta apenas porque é o padrão. Como o comportamento interno padrão podia mudar, decidimos evitar depender do padrão e definir StatusCode explicitamente para o esperado 200 OK.

Se o teu código definir manualmente o código de estado e for quebrado por esta alteração, terás de alterar a ação do comando. Por exemplo, o seguinte excerto de código define um código de estado 202 e é quebrado por esta alteração.

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

Para manter o comportamento desejado de um código de estado 202, os seguintes excertos de código mostram algumas opções.

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();
}

APIs afetadas

  • Ações do controlador MVC/API

Consulte também