ActionResult<T> imposta StatusCode su 200
Quando si restituisce un oggetto T
in un'azione controller MVC/API che dichiara il tipo restituito come ActionResult<TValue>, ObjectResult.StatusCode viene sempre impostato su 200, tranne quando T
è ProblemDetails.
Questa modifica può causare un comportamento imprevisto in alcuni scenari in cui è stato impostato manualmente il codice di stato, poiché in precedenza ObjectResult.StatusCode era null
. Inoltre, un filtro azione potrebbe essere interessato da questa modifica se prevede un valore null anziché 200.
Versione introdotta
ASP.NET Core 6.0
Comportamento precedente
In precedenza, l'azione di un controller che restituisce T
e imposta Response.StatusCode
generava manualmente il codice di stato della risposta specificato. Ad esempio, l'azione del controller seguente genererà una risposta 202 Accepted
.
// Generates a 202 Accepted response
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
Nuovo comportamento
Ora, la stessa azione del controller che restituisce T
e imposta Response.StatusCode
manualmente genera sempre una risposta 200 OK
.
// Generates a 200 OK response
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
Tipo di modifica che causa un'interruzione
Questa modifica può influire sulla compatibilità dell'origine.
Motivo della modifica
La restituzione di un codice di stato di 200 OK
è documentata a partire da ASP.NET Core 3.1. Tuttavia, mantiene StatusCode come null
e alla fine genera una risposta 200 OK
solo perché è l'impostazione predefinita. Poiché il comportamento interno predefinito può cambiare, è stato deciso di evitare di basarsi sul valore predefinito e di impostare StatusCode in modo esplicito su 200 OK
.
Azione consigliata
Se il codice imposta manualmente il codice di stato e viene interrotto da questa modifica, sarà necessario modificare l'azione del controller. Ad esempio, il frammento di codice seguente imposta un codice di stato 202 e viene interrotto da questa modifica.
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
Per mantenere il comportamento desiderato di un codice di stato 202, i frammenti di codice seguenti mostrano alcune opzioni.
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 interessate
- Azioni del controller MVC/API