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.

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

Vedi anche