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

12
我正在使用.NET Core开发ASP.NET Web API。这个Web API将主要被UI应用程序访问(使用ASP.NET Core MVC开发的UI),但是未来API也可能被其他应用程序访问。
我的WEB API中所有方法都是异步的。
如果我希望客户端进行内容协商,那么API操作方法的返回类型应该是Task<IActionresult>还是Task<SomePOCO>
如果我希望方法始终以JSON格式返回数据,那么API操作方法的返回类型应该是什么?应该是Task<IActionResult>还是Task<JsonResult>还是Task<SomePOCO>?因为我认为这3个都可以工作,所以不确定哪一个在这里是适当的?

请勿把标签强制添加到问题标题中 http://stackoverflow.com/help/tagging - Tseng
2个回答

13
如果我想让客户端进行内容协商,那么API操作方法的返回类型应该是什么?
为了进行内容协商,返回Task<ObjectResult>Task<MyPoco>。 框架会自动将POCO包装在ObjectResult中;因此,这两个选项是等效的,并且都会遵循HTTP Accept标头。通过返回任何实现ObjectResult的结果(例如,OkObjectResult)也可以进行内容协商。
如果我希望该方法始终以JSON格式返回数据,那么API操作方法的返回类型应该是什么?
要始终返回JSON,请返回Task<JsonResult>(或使用[Produces]过滤器)。
另请参阅:https://docs.asp.net/en/latest/mvc/models/formatting.html#content-negotiation 那么我就假设IActionResult只用于MVC控制器了吗? IActionResultController返回的所有结果的规范。如果您的操作签名具有IActionResult返回类型,则您的操作方法体可以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


那么我假设IActionResult只用于MVC控制器? - LP13
@LP13 IActionResult 是顶层接口。大多数结果(如果不是全部)都实现了 IActionResult。请参见编辑。 - Shaun Luttin

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接