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.
Action recommandée
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