C# 什么';控制器方法返回ActionResult的原因是什么?(ASP.NET核心Web API)

C# 什么';控制器方法返回ActionResult的原因是什么?(ASP.NET核心Web API),c#,.net,asp.net-core,asp.net-core-webapi,C#,.net,Asp.net Core,Asp.net Core Webapi,我对Web API相当陌生。我观察到一些方法返回一个ActionResult。为什么呢?例如,返回一个CustomerDto难道还不够吗 返回ActionResult不提供有关返回的实际对象的任何线索。我错过了什么吗?设计Web API有多种方法。在您的情况下,您可以返回CustomerDto。根据文档(),Web API控制器操作可以返回以下任何一项: -空虚 -HttpResponseMessage -IHttpActionResult -其他类型的 通过使用IHttpActionResul

我对Web API相当陌生。我观察到一些方法返回一个
ActionResult
。为什么呢?例如,返回一个
CustomerDto
难道还不够吗


返回ActionResult不提供有关返回的实际对象的任何线索。我错过了什么吗?

设计Web API有多种方法。在您的情况下,您可以返回CustomerDto。根据文档(),Web API控制器操作可以返回以下任何一项: -空虚 -HttpResponseMessage -IHttpActionResult -其他类型的


通过使用IHttpActionResult,您可以更好地控制Http响应代码。

设计Web API有多种方法。在您的情况下,您可以返回CustomerDto。根据文档(),Web API控制器操作可以返回以下任何一项: -空虚 -HttpResponseMessage -IHttpActionResult -其他类型的


通过使用IHttpActionResult,您可以更好地控制Http响应代码。

Web API是一个灵活的平台-您可以编写简单的API,始终只返回特定的结果类型(例如您的
CustomerTo
)或者,您可以编写更复杂的API,真正关心HTTP语义,并希望对状态代码、其他HTTP头等有更多的控制

或者,您的方法可能正在处理“资源”,这些资源具有更复杂的表示形式,不容易由C#中的单个DTO类建模,因此您需要多种可能的“返回类型”的灵活性


如果您不想要那种级别的控制,是的,您可以继续并只返回DTO类型。据我所知,没有人会强迫你使用
ActionResult

Web API是一个灵活的平台-你可以编写简单的API,总是只返回特定的结果类型(例如你的
CustomerTo
)或者,您可以编写更复杂的API,真正关心HTTP语义,并希望对状态代码、其他HTTP头等有更多的控制

或者,您的方法可能正在处理“资源”,这些资源具有更复杂的表示形式,不容易由C#中的单个DTO类建模,因此您需要多种可能的“返回类型”的灵活性


如果您不想要那种级别的控制,是的,您可以继续并只返回DTO类型。据我所知,没有人会强迫您使用
ActionResult

在ASP.NET核心中,以前的MVC“Controller”类和Web Api“ApiController”类合并到一个“Controller”类中。 ActionResult方法,这是一种经典的MVC方法,在构建MVC应用程序时非常有用,它也包含在该合并中,这就是为什么
它在构建Web Api时也可用。

在ASP.NET核心中,以前的MVC“控制器”类和Web Api“ApiController”类合并为一个“控制器”类。 ActionResult方法,这是一种经典的MVC方法,在构建MVC应用程序时非常有用,它也包含在该合并中,这就是为什么
它在构建Web Api时也可用。

如果您注意到.net核心Web Api的预构建项目,并非所有函数都返回
ActionResult
IActionResult
。因此,您完全可以返回类似于
CustomerDto
的内容。通过这种方式,您可以将对象返回为json,状态代码为200。但是,假设您的操作包含一些输入,并且您并不总是确定是否会有有效的输出。在这种情况下,您只希望在成功时返回状态代码200,在用户发送无效数据或任何其他状态代码时返回状态代码400(badRequest)。这是处理http请求的标准方法


因此,通过使用
IActionResult
可以使用
return Json(customer)
return Ok(customer)
返回
CustomerDto对象,或者在遇到错误时返回use
BadRequest(myErrors)

如果您注意到.net核心web api的预构建项目,则并非所有函数都返回
ActionResult
IActionResult
。因此,您完全可以返回类似于
CustomerDto
的内容。通过这种方式,您可以将对象返回为json,状态代码为200。但是,假设您的操作包含一些输入,并且您并不总是确定是否会有有效的输出。在这种情况下,您只希望在成功时返回状态代码200,在用户发送无效数据或任何其他状态代码时返回状态代码400(badRequest)。这是处理http请求的标准方法


因此,通过使用
IActionResult
可以使用
return Json(customer)
return Ok(customer)
返回
CustomerDto对象,或者在遇到错误时返回use
BadRequest(myErrors)

当你说它“不提供任何线索”时,它不提供什么线索?在响应体中返回有效负载的数据并不是你在API中唯一做的事情。例如,您可以重定向或仅发送标题。从IActionResult派生的各种类基本上都是方便类,用于设置所需的状态代码和头。只是,它们是方便类,既方便又不麻烦,因为对于主流(返回DTO),它们模糊了代码,而不是澄清代码。即使对于备用流,它们也会“保护”您免受http细节的影响,例如写入
Response.StatusCode=202;Response.ContentType=“text/json”
但这真的是对待开发人员的一种有用方法吗?当你说它“不提供线索”时,它不提供什么线索?在响应体中返回有效负载的数据并不是你在API中唯一做的事情。例如,您可以重定向或仅发送标题。从IActionResult派生的各种类基本上都是用于设置所需状态代码和hea的方便类