无法在Task <iactionresult>,IActionResult和ActionResult <thing>之间进行选择

时间:2019-01-23 22:19:27

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

虽然我确实了解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);
}

在一般的绿色场景中,我无法确定哪个最合适。前两个工作貌似。直观地讲,我更喜欢使用第三个树,但是由于它不起作用(转换无效),我担心也许我在拨错二叉树。

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

1 个答案:

答案 0 :(得分:3)

这里是不同返回选项的快速比较:

特定类型

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页面Controller action return types in ASP.NET Core Web API