ActionResult<T> ustawia statusCode na 200
W przypadku zwracania T
akcji kontrolera MVC/API, która deklaruje typ zwracany jako ActionResult<TValue>, ObjectResult.StatusCode parametr jest zawsze ustawiony na wartość 200, z wyjątkiem sytuacji, gdy T
element ma ProblemDetailswartość .
Ta zmiana może spowodować nieoczekiwane zachowanie w niektórych scenariuszach, w których ręcznie ustawisz kod stanu, ponieważ wcześniej był null
to ObjectResult.StatusCode . Ponadto ten filtr akcji może mieć wpływ na tę zmianę, jeśli oczekuje wartości null zamiast 200.
Wprowadzona wersja
ASP.NET Core 6.0
Poprzednie zachowanie
Wcześniej akcja kontrolera zwracająca T
i ustawiana Response.StatusCode
ręcznie wygenerowała określony kod stanu odpowiedzi. Na przykład następująca akcja kontrolera spowoduje wygenerowanie 202 Accepted
odpowiedzi.
// Generates a 202 Accepted response
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
Nowe zachowanie
Teraz ta sama akcja kontrolera, która zwraca T
i ustawia Response.StatusCode
ręcznie, zawsze generuje 200 OK
odpowiedź.
// Generates a 200 OK response
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
Typ zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność źródła.
Przyczyna wprowadzenia zmiany
Zwracanie kodu stanu obiektu 200 OK
jest udokumentowane, ponieważ ASP.NET Core 3.1. Jednak zachowuje StatusCode się tak, jak null
i ostatecznie generuje 200 OK
odpowiedź tylko dlatego, że jest to wartość domyślna. Ponieważ domyślne zachowanie wewnętrzne może ulec zmianie, postanowiliśmy unikać polegania na wartości domyślnej i jawnie ustawić StatusCode oczekiwaną 200 OK
wartość .
Zalecana akcja
Jeśli kod ustawia kod stanu ręcznie i jest uszkodzony przez tę zmianę, musisz zmienić akcję kontrolera. Na przykład poniższy fragment kodu ustawia kod stanu 202 i jest uszkodzony przez tę zmianę.
public ActionResult<Model> Get()
{
Response.StatusCode = StatusCodes.Status202Accepted;
return new Model();
}
Aby zachować żądane zachowanie kodu stanu 202, poniższe fragmenty kodu pokazują niektóre opcje.
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();
}
Dotyczy interfejsów API
- Akcje kontrolera MVC/interfejsu API