在Asp.net Core Web API中返回“JsonResult / IActionResult”或“Task <someobject>”或只是“SomeObject”有什么区别?

时间:2016-09-01 13:58:14

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

考虑ASP.NET Core Web API控制器方法的以下方法签名:

public JsonResult GetById(string id);
public async Task<SomeObject> GetById(string id);
public SomeObject GetById(string id)

在默认设置中,所有都将SomeObject的JSON表示返回给客户端。框架是否以不同的方式对待它们?如果是,那么何时应该使用它?

例如,大多数文档建议使用辅助函数(如IActionResult)生成的OK()实现。然而,所有这些似乎为你做的是设置StatusCode,并且它们具有混淆你的方法返回的内容的缺点 - 实际上你可以在不同的情况下返回不同的类型,我认为这是一个可怕的想法。连锁效应是像Swagger这样的工具无法预测该方法将返回什么。

所以我更愿意返回SomeObject

  1. 我错过了重要的事情吗?和
  2. 返回Task<SomeObject>有什么好处 - 是否总是有用,或者只有在方法使用异步调用时?
  3. 编辑:尝试澄清 - 所有签名都将SomeObject的JSON表示返回给客户端,但从C#的角度来看,它们具有不同的返回类型,因此MVC框架是做一些工作来转换它们。

    哪个是最佳做法,为什么?是否有充分的理由返回JsonResult而不是返回SomeObject?是否应该总是使用返回Task<SomeObject>,或者如果操作中包含异步代码,它是否只有价值(我假设)?

1 个答案:

答案 0 :(得分:2)

您在搜索什么是ASP.NET核心中的formatters以及它们的工作原理。来自官方文件:

  

返回任何特定类型不需要操作; MVC支持任何对象返回值。如果一个动作返回一个IActionResult实现并且控制器继承自Controller,那么开发人员有许多与许多选择相对应的辅助方法。返回非IActionResult类型对象的操作的结果将使用适当的IOutputFormatter实现进行序列化。

您还需要了解Content Negotiation

  

只有在请求中出现Accept标头时才会进行内容协商。当请求包含accept头时,框架将按优先顺序枚举accept头中的媒体类型,并尝试查找可以使用accept头指定的格式之一生成响应的格式化程序。如果找不到可以满足客户端请求的格式化程序,框架将尝试查找可以产生响应的第一个格式化程序(除非开发人员已在MvcOptions上配置选项以返回406 Not Acceptable而不是)。

最后在JsonResult范围内使用:

  

操作可以返回始终以特定方式格式化的特定结果。例如,无论客户端首选项如何,返回JsonResult都将返回JSON格式的数据。

Formatting Response Data部分阅读详情。