【问题标题】:Can't decide between Task<IActionResult>, IActionResult and ActionResult<Thing>无法在 Task<IActionResult>、IActionResult 和 ActionResult<Thing> 之间做出决定
【发布时间】:2019-06-17 14:15:56
【问题描述】:

虽然我确实了解TaskActionResult 等的概念。但如果没有指定其他内容,我仍然不确定在控制器中输入哪个最直观。

考虑到与返回的类型一样明确,我应该这样:

[HttpGet] public ActionResult<Thing> Get()
{
  return Ok(Context.Things);
}

但是,我应该使用通用类型的 API 范例:

[HttpGet] public IActionResult Get()
{
  return Ok(Context.Things);
}

最后,尊重 API 哲学的异步特性,我应该应用以下内容:

[HttpGet] public Task<IActionResult> Get()
{
  return Ok(Context.Things);
}

在一般的、未开发的场景中,我无法决定哪一个最合适。前两个似乎有效。直觉上,我更喜欢使用第三个,但由于它不起作用(转换无效),我担心也许我在吠叫错误的二叉树。

完全不知道如何用谷歌搜索它,我正在获取各种示例。不确定如何判断哪些是相关的,我更喜欢问。

【问题讨论】:

  • 这里是来自MSDN的这些选项的一个很好的解释。
  • @RacilHilan 很好的链接。当我用谷歌搜索时,我错过了。请重新发布您的评论作为答案,添加一些解释,只是一点点。我很乐意接受。

标签: c# .net asp.net-web-api


【解决方案1】:

以下是不同退货选项的快速比较:

具体类型

public Thing Get() {
    return Context.Things.GetThing(1234);
}

如果操作总是返回一种可能的类型,这是可以的。但是,大多数操作可能会返回具有不同类型的异常(即 200 以外的状态代码)。

IActionResult 类型

这解决了上述问题,因为IActionResult 返回类型涵盖了不同的返回类型。

public IActionResult Get() {
    Thing thing = Context.Things.GetThing(1234);
    if (thing == null)
        return NotFound();
    else
        return Ok(thing);
}

对于异步操作,使用Task&lt;IActionResult&gt;:

public async Task<IActionResult> Get() {
    Thing thing = await Context.Things.GetThing(1234);
    if (thing == null)
        return NotFound();
    else
        return Ok(thing);
}

ActionResult 类型

ASP.NET Core 2.1 引入了 ActionResult&lt;T&gt; 返回类型,与 IActionResult 类型相比,它具有以下优点:

1- 从ActionResult&lt;T&gt; 中的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.GetThing(1234);
    if (thing == null)
        return NotFound();
    else
        return thing;
}

对于异步操作,使用Task&lt;ActionResult&lt;T&gt;&gt;:

public async Task<ActionResult<Thing>> Get() {
    Thing thing = await Context.Things.GetThing(1234);
    if (thing == null)
        return NotFound();
    else
        return thing;
}

更多详情可以参考MSDN页面Controller action return types in ASP.NET Core Web API

【讨论】:

  • 第一个public Thing Get() { return Ok(Context.Things);}可以编译吗? Ok(Context.Things)如何转换为Thing?我无法编译它。
  • @TheShortestMustacheTheorem 我删除了Ok(),这是一个复制/粘贴错误。我还使用.GetThing(1234) 增强了示例,使它们更加真实。
  • 使用Task&lt;ActionResult&lt;Thing&gt;&gt;Task&lt;IActionResult&lt;Thing&gt;&gt;有什么区别?推荐的方法是什么?
  • @variable IActionResult 是一个接口而不是泛型类型,所以 Task&lt;IActionResult&lt;Thing&gt;&gt; 没有意义。异步版本为Task&lt;IActionResult&gt;
猜你喜欢
  • 2019-07-30
  • 2017-11-06
  • 2019-08-14
  • 2021-06-04
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2020-12-29
相关资源
最近更新 更多