"或仅返回 "SomeObject"有什么区别?-6ren"> "或仅返回 "SomeObject"有什么区别?-考虑 ASP.NET Core Web API Controller 方法的以下方法签名: public JsonResult GetById(string id); public async Tas-6ren">
gpt4 book ai didi

c# - 在 Asp.net Core Web API 中返回 "JsonResult/IActionResult"或 "Task"或仅返回 "SomeObject"有什么区别?

转载 作者:行者123 更新时间:2023-11-30 16:47:36 31 4
gpt4 key购买 nike

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

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

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

例如,大多数文档建议使用 IActionResult 的实现由辅助函数生成,例如 OK() .然而,所有这些似乎都为你做的是设置 StatusCode,它们的缺点是混淆了你的方法返回的内容——实际上你可以在不同的情况下返回不同的类型,我认为这是一个糟糕的主意。一个链式 react 是像 Swagger 这样的工具无法预测该方法将返回什么。

所以我宁愿返回SomeObject :

  1. 我是不是漏掉了什么重要的东西?
  2. 返回有什么好处Task<SomeObject> - 它总是有用的,还是仅当方法使用异步调用时有用?

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

哪个是最佳实践,为什么?有充分的理由返回吗 JsonResult而不是返回 SomeObject ?应该返回 Task<SomeObject>总是被使用,还是仅当操作中包含异步代码时才有值(value)(我假设)?

最佳答案

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

An action isn’t required to return any particular type; MVC supports any object return value. If an action returns an IActionResult implementation and the controller inherits from Controller, developers have many helper methods corresponding to many of the choices. Results from actions that return objects that are not IActionResult types will be serialized using the appropriate IOutputFormatter implementation.

您还需要阅读有关内容协商的内容:

Content negotiation only takes place if an Accept header appears in the request. When a request contains an accept header, the framework will enumerate the media types in the accept header in preference order and will try to find a formatter that can produce a response in one of the formats specified by the accept header. In case no formatter is found that can satisfy the client’s request, the framework will try to find the first formatter that can produce a response (unless the developer has configured the option on MvcOptions to return 406 Not Acceptable instead).

最后在 JsonResult 范围内使用:

Actions can return specific results that are always formatted in a particular manner. For example, returning a JsonResult will return JSON-formatted data, regardless of client preferences.

阅读更多 Formatting Response Data部分。

关于c# - 在 Asp.net Core Web API 中返回 "JsonResult/IActionResult"或 "Task<SomeObject>"或仅返回 "SomeObject"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39273524/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com