Partager via


ActionResult<T> définit StatusCode sur 200

En cas de renvoi d’un T dans une action de contrôleur MVC/API qui déclare le type de retour ActionResult<TValue>, le ObjectResult.StatusCode est toujours défini sur 200, sauf si le T est un ProblemDetails.

Ce changement peut entraîner un comportement inattendu dans certains scénarios où vous définissez manuellement le code d’état, puisque le ObjectResult.StatusCode était null auparavant. Par ailleurs, un filtre d’action peut être affecté par ce changement s’il attend une valeur null au lieu de 200.

Version introduite

ASP.NET Core 6.0

Comportement précédent

Auparavant, l’action d’un contrôleur renvoyant T et définissant Response.StatusCode manuellement générait le code d’état de réponse spécifié. Par exemple, l’action de contrôleur suivant génère une réponse 202 Accepted.

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

Nouveau comportement

Désormais, la même action du contrôleur qui renvoie T et définit Response.StatusCode manuellement génère toujours une réponse 200 OK.

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

Type de changement cassant

Ce changement peut affecter la compatibilité source.

Raison du changement

Le renvoi du code d’état 200 OK est documenté depuis ASP.NET Core 3.1. Toutefois, il garde StatusCode avec la valeur null et finit par générer une réponse 200 OK uniquement parce que c’est la valeur par défaut. Comme le comportement interne par défaut peut changer, nous avons décidé de ne pas nous appuyer sur la valeur par défaut et de définir StatusCode explicitement sur le 200 OK attendu.

Si votre code définit manuellement le code d’état et qu’il est cassé par ce changement, vous devez changer l’action de votre contrôleur. Par exemple, l’extrait de code suivant définit le code d’état 202 et est cassé par ce changement.

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

Pour conserver le comportement souhaité d’un code d’état 202, les extraits de code suivants présentent certaines options.

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 affectées

  • Actions du contrôleur MVC/API

Voir aussi