Поделиться через


ActionResult<T> задает для StatusCode значение 200

При возвращении T в действие контроллера MVC/API, которое объявляет тип возвращаемого значения ActionResult<TValue>как, ObjectResult.StatusCode всегда задано значение 200, за исключением случаев, когда T это ProblemDetailsзначение.

Это изменение может привести к непредвиденному поведению в некоторых сценариях, когда вы вручную задали код состояния, так как ранее ObjectResult.StatusCode это было null. Кроме того, фильтр действий может повлиять на это изменение, если ожидается значение NULL вместо 200.

Представленные версии

ASP.NET Core 6.0

Прежнее поведение

Ранее действие контроллера, которое возвращает T и задает Response.StatusCode вручную заданный код состояния ответа. Например, действие следующего контроллера создаст 202 Accepted ответ.

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

Новое поведение

Теперь то же действие контроллера, которое возвращает T и задает Response.StatusCode вручную, всегда создает 200 OK ответ.

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

Тип критического изменения

Это изменение может повлиять на совместимость исходного кода.

Причина изменения

Возврат кода 200 OK состояния задокументирован с момента ASP.NET Core 3.1. Однако он сохраняется StatusCode null как и в конечном итоге создает 200 OK ответ только потому, что это значение по умолчанию. Так как внутреннее поведение по умолчанию может измениться, мы решили избежать использования по умолчанию и явно задать StatusCode ожидаемое 200 OK.

Если код задает код состояния вручную и нарушается этим изменением, необходимо изменить действие контроллера. Например, следующий фрагмент кода задает код состояния 202 и нарушается этим изменением.

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

Чтобы сохранить требуемое поведение кода состояния 202, в следующих фрагментах кода показаны некоторые параметры.

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

Затронутые API

  • Действия контроллера MVC/API

См. также