ActionResult<T> legt „StatusCode“ auf 200 fest.

Beim Zurückgeben von T in einer MVC/API-Controlleraktion, die den Rückgabetyp als ActionResult<TValue> deklariert, wird der ObjectResult.StatusCode immer auf 200 festgelegt, außer wenn T vom Typ ProblemDetails ist.

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

Eingeführt in Version

ASP.NET Core 6.0

Vorheriges Verhalten

Bisher wurde der angegebene Antwortstatuscode von einer Controlleraktion generiert, die T zurückgibt und Response.StatusCode manuell festlegt. Die folgende Controlleraktion generiert beispielsweise eine 202 Accepted-Antwort.

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

Neues Verhalten

Dieselbe Controlleraktion, die T zurückgibt und Response.StatusCode manuell festlegt, generiert jetzt immer eine 200 OK-Antwort.

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

Typ des Breaking Changes

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

Grund für die Änderung

Das Zurückgeben eines 200 OK-Statuscodes ist seit ASP.NET Core 3.1 dokumentiert. StatusCode wird jedoch als null beibehalten, und schließlich wird nur deswegen eine 200 OK-Antwort, weil es sich um den Standardwert handelt. Da sich das interne Standardverhalten ändern kann, haben wir beschlossen, die Verwendung der Standardeinstellung zu vermeiden und StatusCode explizit auf die erwartete 200 OK-Antwort festzulegen.

Wenn Ihr Code den Statuscode manuell festlegt und dies einen Breaking Change darstellt, müssen Sie die Controlleraktion ändern. Der folgende Codeschnipsel legt beispielsweise den Statuscode 202 fest, was einen Breaking Change darstellt.

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

Die folgenden Codeschnipsel zeigen einige Optionen zum Beibehalten des gewünschten Verhaltens eines 202-Statuscodes.

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

Weitere Informationen