ASP.NET Core API - ActionResult <T> vs async Task <T>

Cal*_*len 7 c# asp.net-core asp.net-core-webapi

如果我使用.NET Core 2.1和一些典型的POST和GET方法创建API,那么这些方法的返回类型是最合适的,ActionResult<T>还是async Task<T>?我的一个朋友在他创建的每个API中都使用后者,这就是我所在的公司所使用的,而PluralSite上的教程使用前者.我理解每个人做了什么,但我不确定哪个应该为任何给定的HTTP请求实现?

Tan*_*jel 7

ASP.NET Core为Web API控制器操作返回类型提供以下选项:

  • Specific type (T)
  • IActionResult
  • ActionResult<T>

具体类型(T):

最简单的操作返回原始或复杂数据类型(例如,字符串或自定义对象类型).如果在执行动作期间没有已知的防范条件,则返回特定类型就足够了.上述操作不接受任何参数,因此不需要参数约束验证.

当需要在动作中考虑已知条件时,引入多个返回路径.在这种情况下,将ActionResult返回类型与基元或复合返回类型混合是很常见的.适应这种行为的任何一种IActionResultActionResult<T>必要的.

IActionResult类型:

IActionResultActionResult一个动作中有多个返回类型时,返回类型是合适的.该ActionResult类型的表示各种HTTP状态代码.一些常用的返回类型属于这一类的BadRequestResult (400),NotFoundResult (404)OkObjectResult(200).

ActionResult<T> 类型:

ASP.NET Core 2.1添加了新的编程约定,可以更轻松地构建干净的描述性Web API.ActionResult<T>是一种新类型,允许应用程序返回响应类型或任何其他操作结果(类似于IActionResult),同时仍指示响应类型.

ActionResult<T>更具体的ASP.NET核心> = 2.1中的 Web API,并 ActionResult<T>提供以下IActionResult类型的好处:

  • [ProducesResponseType]属性的类型属性可以被排除.例如,[ProducesResponseType(200, Type = typeof(Product))]简化为[ProducesResponseType(200)].相反,动作的预期返回类型是从Tin中推断出来的ActionResult<T>.
  • 隐式转换运营商支持的转换TActionResultActionResult<T>.T转换为ObjectResult,这意味着将返回new ObjectResult(T);简化为return T;.

有关更多详细信息:ASP.NET Core Web API中的Controller操作返回类型

  • 您甚至都没有提到异步或任务。 (3认同)
  • 您设法按原样复制Microsoft文档。 (2认同)

Pma*_*Ace 6

第三个解决方案:IActionResult任务,如下所示:

[HttpGet]
[ProducesResponseType(typeof(IList<Currency>), 200)]
public async Task<IActionResult> GetAll()
{
    return Ok(await _typeService.GetCurrenciesAsync().ConfigureAwait(false));
}

[HttpGet("{id}", Name = "GetCurrency")]
[ProducesResponseType(typeof(Currency), 200)]
public async Task<IActionResult> Get([FromRoute]int id)
{
    return Ok(await _expenseService.GetCurrencyAsync(id).ConfigureAwait(false));
}
Run Code Online (Sandbox Code Playgroud)

查看Microsoft的示例以及为什么它们返回接口:IActionResult