ActionResult<T> nastaví StatusCode na 200

Při vrácení T v akci kontroleru MVC/API, která deklaruje návratový typ jako ActionResult<TValue>, ObjectResult.StatusCode je vždy nastavena na hodnotu 200, s výjimkou případů, kdy T je ProblemDetails.

Tato změna může způsobit neočekávané chování v některých scénářích, kdy jste stavový kód nastavili ručně, protože dříve ObjectResult.StatusCode byla null. Filtr akcí může být také ovlivněn touto změnou, pokud očekává hodnotu null místo 200.

Zavedená verze

ASP.NET Core 6.0

Předchozí chování

Dříve akce kontroleru, která vrací T a nastavuje Response.StatusCode ručně vygenerovaný zadaný stavový kód odpovědi. Například následující akce kontroleru vygeneruje 202 Accepted odpověď.

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

Nové chování

Teď stejná akce kontroleru, která vrací T a nastavuje Response.StatusCode ručně, vždy vygeneruje 200 OK odpověď.

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

Typ zásadní změny

Tato změna může mít vliv na kompatibilitu zdroje.

Důvod změny

Vrácení stavového 200 OK kódu je zdokumentované od ASP.NET Core 3.1. Zachová ale StatusCode jako null a nakonec vygeneruje 200 OK odpověď jenom proto, že se jedná o výchozí hodnotu. Vzhledem k tomu, že se výchozí vnitřní chování může změnit, rozhodli jsme se vyhnout spoléhat na výchozí a explicitně nastavit StatusCode na očekávaný 200 OK.

Pokud váš kód nastaví stavový kód ručně a touto změnou se přeruší, budete muset změnit akci kontroleru. Například následující fragment kódu nastaví stavový kód 202 a tato změna se přeruší.

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

Chcete-li zachovat požadované chování stavového kódu 202, následující fragmenty kódu zobrazují některé možnosti.

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

Ovlivněná rozhraní API

  • Akce kontroleru MVC/API

Viz také