Вот быстрое сравнение различных вариантов возврата:
Определенный тип
public Thing Get() {
return Ok(Context.Things);
}
Это нормально, если действие всегда возвращает один возможный тип.Однако большинство действий могут возвращать исключения (т. Е. Коды состояния, отличные от 200), которые имеют разные типы.
Тип IActionResult
Это решает описанную выше проблему, поскольку тип возвращаемого значения IActionResult
охватывает различные типы возвращаемых данных..
public IActionResult Get() {
Thing thing = Context.Things;
if (thing == null)
return NotFound();
else
return Ok(thing);
}
Для асинхронного действия используйте Task<IActionResult>
:
public async Task<IActionResult> Get() {
Thing thing = await Context.Things;
if (thing == null)
return NotFound();
else
return Ok(thing);
}
Тип ActionResult
В ASP.NET Core 2.1 введен тип возврата ActionResult<T>
, который предлагаетследующие преимущества по сравнению с типом IActionResult
:
1 - ожидаемый тип возврата действия выводится из T
в ActionResult<T>
.Если вы украшаете свое действие атрибутом [ProducesResponseType]
, вам больше не нужно явно указывать его свойство Type
.Например, вы можете просто использовать [ProducesResponseType(200)]
вместо [ProducesResponseType(200, Type = typeof(Thing))]
.
2- T
преобразует в ObjectResult
, что означает, что return new ObjectResult(T);
упрощается до return T;
.
public ActionResult<Thing> Get() {
Thing thing = Context.Things;
if (thing == null)
return NotFound();
else
return thing;
}
Для асинхронного действия используйте Task<ActionResult<T>>
:
public async Task<ActionResult<Thing>> Get() {
Thing thing = await Context.Things;
if (thing == null)
return NotFound();
else
return thing;
}
Для получения дополнительной информации см. Страницу MSDN Типы возвращаемых действий контроллера в ASP.NET Core Web API .