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.
Empfohlene Maßnahme
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