虽然我确实了解Task
,ActionResult
等的概念。但是我仍然不确定如果未指定其他内容,那么键入控制器将是最直观的。
考虑返回类型明确时,我应该这样:
[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);
}
在一般的绿色场景中,我无法确定哪个最合适。前两个工作貌似。直观地讲,我更喜欢使用第三个树,但是由于它不起作用(转换无效),我担心也许我在拨错二叉树。
完全不知道如何搜索它,我正在获得各种各样的示例。我更喜欢问不确定如何判断哪些是相关的。
答案 0 :(得分:3)
这里是不同返回选项的快速比较:
public Thing Get() {
return Ok(Context.Things);
}
如果操作将始终返回一种可能的类型,则可以。但是,大多数操作可能会返回类型不同的异常(即200以外的状态代码)。
这解决了上面的问题,因为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);
}
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。