return类型的WEB API Action Method应该是什么?

What should be the return type of WEB API Action Method?

我正在使用 .NET Core 开发 ASP.NET Web API。此 Web API 将主要由 UI 应用程序访问(UI 将使用 ASP.NET 核心 MVC 开发)但将来 API 可能会被访问其他应用程序也是如此。

在我的 WEB 中 API 所有方法都是异步的。

如果我希望客户端进行内容协商,那么 API 操作方法的 return 类型应该是什么 Task<IActionresult>Task<SomePOCO>

如果我希望方法始终以 JSON 格式 return 数据,那么 API 操作方法的 return 类型应该是什么?应该是 Task<IActionResult>Task<JsonResult> 还是 Task<SomePOCO> 因为我认为所有 3 个都可以工作所以不确定哪个适合这里?

If I want [the] client to do content negotiation then what should be the return type of the API action method?

要进行内容协商,return Task<ObjectResult>Task<MyPoco>

框架自动将 POCO 包装在 ObjectResult 中;因此,这两个选项是等效的,并且都将遵守 HTTP Accept header。您还可以通过 returning 任何实现 ObjectResult 的结果来进行内容协商,例如 OkObjectResult

If I want [the] method to always return data in JSON format then what should be [the] return type of the API action method?

总是returnJSON,return一个Task<JsonResult>(或者使用[Produces]过滤器)。

另请参阅:https://docs.asp.net/en/latest/mvc/models/formatting.html#content-negotiation

[S]o I am assuming then IActionResult is only used for MVC controller?

IActionResultall 的合同结果 Controller returns。如果您的操作签名具有 IActionResult return 类型,那么您的操作方法 body 可以 return 任何结果类型,因为它们都实现了 IActionResult 接口。这是继承层次结构。

IActionResult
  ActionResult
    ChallengeResult 
    ContentResult 
    EmptyResult 
    FileResult 
      FileContentResult 
      FileStreamResult 
      PhysicalFileResult 
      VirtualFileResult 
    ForbidResult 
    LocalRedirectResult 
    ObjectResult
      CreatedAtActionResult 
      CreatedAtRouteResult 
      CreatedResult 
      BadRequestObjectResult 
      NotFoundObjectResult 
      OkObjectResult 
    RedirectResult 
    RedirectToActionResult 
    RedirectToRouteResult 
    SignInResult 
    SignOutResult 
    StatusCodeResult 
      NoContentResult 
      NotFoundResult 
      OkResult 
      UnauthorizedResult 
      UnsupportedMediaTypeResult 
      BadRequestResult 

另请参阅:https://github.com/aspnet/Mvc/tree/dev/src/Microsoft.AspNetCore.Mvc.Core

看看招摇: https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger 最好为方法指定 ProducesResponseType 属性:

[ProducesResponseType(typeof(TodoItem), 201)]
public IActionResult Create([FromBody, Required] TodoItem item)

以便自动生成 swagger 文档以显示该方法的实际返回数据。