Freigeben über


ActionResult<T> legt StatusCode auf 200 fest

Wenn eine T in einer MVC/API-Controlleraktion zurückgegeben wird, die den Rückgabetyp als ActionResult<TValue> deklariert, wird der ObjectResult.StatusCode immer auf 200 gesetzt, außer wenn das T ein ProblemDetails ist.

Diese Änderung kann in einigen Szenarien zu unerwartetem Verhalten führen, in denen Sie den Statuscode manuell festlegen, da dies zuvor der ObjectResult.StatusCode Fall war null. Außerdem könnte ein Aktionsfilter von dieser Änderung betroffen sein, wenn er einen NULL-Wert anstelle von 200 erwartet.

Eingeführte Version

ASP.NET Core 6.0

Vorheriges Verhalten

Zuvor erzeugte die Aktion eines Controllers, die T zurückgibt und Response.StatusCode setzt, manuell den angegebenen Antwortstatuscode. Beispielsweise generiert die Aktion des folgenden Controllers eine 202 Accepted Antwort.

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

Neues Verhalten

Nun generiert die Handlung desselben Controllers, die T zurückgibt und Response.StatusCode manuell festlegt, immer eine 200 OK-Antwort.

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

Art der einschneidenden Änderung

Diese Änderung kann sich auf die Quellkompatibilität auswirken.

Grund für Änderung

Das Zurückgeben eines Statuscodes von 200 OK ist seit ASP.NET Core 3.1 dokumentiert. Es behält jedoch StatusCode als null bei und generiert schließlich eine 200 OK Antwort nur, da es die Standardeinstellung ist. Da sich das interne Standardverhalten ändern könnte, haben wir beschlossen, nicht auf die Standardeinstellung zu vertrauen und stattdessen explizit StatusCode auf das erwartete 200 OK festzulegen.

Wenn Ihr Code den Statuscode manuell festlegt und durch diese Änderung unterbrochen wird, müssen Sie die Controlleraktion ändern. Der folgende Codeausschnitt legt beispielsweise einen Statuscode von 202 fest und wird durch diese Änderung unterbrochen.

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

Um das gewünschte Verhalten eines 202-Statuscodes beizubehalten, zeigen die folgenden Codeausschnitte einige Optionen an.

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

Betroffene APIs

  • MVC/API-Controlleraktionen

Siehe auch