Udostępnij za pośrednictwem


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ł nullto 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 OKwartość .

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

Zobacz też