首页 文章

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

提问于
浏览
3

请考虑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

  • 我错过了重要的事情吗?

  • 返回 Task<SomeObject> 有什么好处 - 它总是有用,还是只有方法使用异步调用?

Edit: 尝试澄清 - 所有签名都将 SomeObject 的JSON表示返回给客户端,但从C#的角度来看,它们具有不同的返回类型,因此MVC框架正在做一些转换它们的工作 .

哪个是最佳做法,为什么?是否有充分的理由返回 JsonResult 而不是返回 SomeObject ?应该总是使用返回 Task<SomeObject> ,还是只有动作中有异步代码才有 Value (我假设)?

1 回答

  • 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部分的更多内容 .

相关问题