返回"JsonResult/IActionResult"有什么区别?或“Task< SomeObje

本文关键字:quot Task SomeObje JsonResult IActionResult 返回 什么 区别 | 更新日期: 2023-09-27 18:05:05

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

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

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

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

所以我更愿意返回SomeObject:

  1. 我错过了重要的东西吗?,和
  2. 返回Task<SomeObject>的好处是什么-它总是有用的,或者只有当方法使用异步调用?

编辑:尝试澄清-所有签名返回SomeObject的JSON表示到客户端,但从c#的角度来看,他们有不同的返回类型,所以MVC框架正在做一些工作来转换它们。

哪个是最佳实践,为什么?是否有一个很好的理由返回JsonResult而不是返回SomeObject ?应该总是使用返回Task<SomeObject>,还是只有在动作中有异步代码时才有价值(我假设)?

返回"JsonResult/IActionResult"有什么区别?或“Task< SomeObje

您要搜索的是ASP中的formatters。. NET Core及其工作原理。来自官方文档:

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

你还需要阅读Content Negotiation:

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

,最后在JsonResult范围内使用:

操作可以返回始终以特定方式格式化的特定结果。例如,返回JsonResult将返回json格式的数据,而不管客户端首选项是什么。

在格式化响应数据部分阅读更多信息。