在 Core 2.2 中返回异步结果时无法使用 Ok(...) 作为状态代码

Kon*_*ten -1 c# asynchronous asp.net-web-api asp.net-core asp.net-core-2.2

我搭建了一个像这样的 WebAPI 模板。

[HttpGet]
public async Task<ActionResult<IEnumerable<ThingVm>>> GetThings()
{
  Task<List<ThingVm>> output = Context.Things
    .Select(e => new ThingVm(e))
    .ToListAsync();
  return await output;
}
Run Code Online (Sandbox Code Playgroud)

我注意到返回的结果不会传达任何状态代码(因为我没有提供 200 或 404 等)。所以我添加了标准的、通常的Ok(...)调用。

[HttpGet]
public async Task<ActionResult<IEnumerable<ThingVm>>> GetThings()
{
  ...
  return await Ok(output);
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,计算机并没有意识到该操作并像这样解释了错误。

CS1061“OkObjectResult”不包含“GetAwaiter”的定义,并且找不到接受“OkObjectResult”类型的第一个参数的可访问扩展方法“GetAwaiter”(您是否缺少 using 指令或程序集引用?)

我明白为什么会这样。我不知道如何在保留响应中发出的状态代码的同时解决它。

我在谷歌上搜索了它,但发现了一些非常陈旧的东西完全不相关的东西相当不相关的东西。就是这样 - 根本没有太多其他热门歌曲,这也令人惊讶。

如何发出状态代码并应用异步方法?它们不是相互排斥的,是吗?

Roe*_*oel 7

你为什么不等待结果呢?

[HttpGet]
public async Task<ActionResult<IEnumerable<ThingVm>>> GetThings()
{
  var output = await Context.Things
    .Select(e => new ThingVm(e))
    .ToListAsync();

  return Ok(output);
}
Run Code Online (Sandbox Code Playgroud)

  • 这当然有效。然而,我的印象是,当我们等待结果时,此处提供的代码会失去异步性。然后,一旦实现,我们就将整个 shabang 归还。不是吗? (2认同)