前言
从. NET Core 2.1 版开始, 到目前为止, 控制器操作可以返回三种类型的 webApi 响应. 这三种类型都有自己的优点和缺点, 但都缺乏满足 REST 和高可测性的选项.
ASP.NET Core 中可用的响应类型包括最近发布的 2.2 版本
具体类型的结果
IActionResult
的 ActionResult <T>
最后一个 reult 选项 ActionResult <T > 是在. NET Core 2.1 中引入的. 我将使用一个简单的例子来比较使用这三个控制器动作响应类型选项的优缺点.
文章内容
返回 HTTP 状态
这是您在 WebAPI 应用程序开发过程中必须要具备的. 虽然可以遵循 REST, 但是任何程序功能都是由业务需求驱动的. 如果由于控制器操作而返回特定类型, 您可能偶尔发现的一件事肯定会返回自定义 HTTP 状态代码.
让我们看看具有特定类型返回的简单操作, 并让它们注意比较.
具体类型
- [HttpGet("{id}")]
- public IEnumerable<string> GetById(int id)
- {
- if (id>0)
- {
- return new List<string>()
- {
- "Value1","Value2","Value3"
- };
- }
- return null;
- }
我们有了上面的简单单吗, 如果 ID 参数大于 0, 并返回字符串列表, 反则返回 null. 转换成 HTTP, 对于任何返回的数据, 我们将有 200 OK 状态吗响应, 以下是我使用 PostMan 的测试结果图, 请参考.
如果没有数据, 我们将会有一个 204 No Content 响应. 对于大多数客户来说, 这是非常满意的, 但是假设我们需要返回另一个状态代码, 例如, 小于 0 的任何值, 我们直接希望告诉客户发送的数据无效, 理想情况下, 我们将会返回 404 BadRequest 状态代码.
现在这是特定类型选项问题, 由于我们的方法, 我们不能立即返回 400 BadRequest 状态代码, 如果我们决定抛出一个异常会导致 500 ServerError 的响应, 这是错误的, 因为无效数据基本上是客户端错误并且属于 4xx 响应代码列表.
执行此操作的方法是显示设定响应状态码并返回空值, 这样就可以保留未同步的两个操作间隙, 因为你必须要处理状态并返回数据.
- [HttpGet("{id}")]
- public IEnumerable<string> GetById(int id)
- {
- if (id> 0)
- {
- return new List<string>()
- {
- "Value1","Value2","Value3"
- };
- }
- else if (id <0)
- Response.StatusCode = 400;
- return null;
- }
处理 HTTP POST 和 HTTP PATCH / PUT 请求时遇到的问题更多, 而不是 200 OK, 除了之前的 400 BadRequest 之外, 您可能还必须使用 201 Created of 202 Accepted HTTP 状态代码进行响应, 这将是模型验证的情况. 使用不同的状态代码并不是那么直接, 并且您有多条线负责正确的响应, 这与其他两种返回类型不同.
IActionResult
让我们看看我们如何通过使用 IActionResult 作为控制器动作的返回类型来解决这个问题
- [HttpGet("{id}")]
- public IActionResult GetById(int id)
- {
- if (id> 0)
- {
- return Ok(new List<String>()
- {
- "Value1",
- "Value2",
- "Value3",
- });
- }
- else if (id <0)
- {
- return BadRequest();
- }
- return NoContent();
- }
现在我们可以自由使用我们认为适合的状态代码, 以告知客户我们或我们没有任何限制地处理他的请求. 使用 IAction 结果显然比返回特定类型实例更先进, 让. NET 决定什么是状态代码.
ActionResult<T>
关于状态代码, IActionResult 和 ActionResult <T > 返回类型同样适用在从方法返回结果时直接设置状态代码方面会产生很大差异
但是, 还有其他方面, ActionResult <T > 比 IActionResult 更高级, 更适合从控制器操作方法返回响应.
- [HttpGet("{id}")]
- public ActionResult<IEnumerable<string>> GetById(int id)
- {
- if (id> 0)
- {
- return Ok(new List<String>()
- {
- "Value1",
- "Value2",
- "Value3",
- });
- }
- else if (id <0)
- {
- return BadRequest();
- }
- return NoContent();
- }
您已经了解了 ASP.NET MVC Core WebAPI 项目中控制器操作的不同响应类型的一些优缺点. 很明显 IActionResult 和 ActionResult <T > 是比返回特定类型更好的选择, 虽然您可能会发现在控制器操作中返回特定类型更为舒适, 但您可能会使单元测试无法正确覆盖您的代码, 因此将来可能会打开潜在的危险.
总结
具体类型
如果在执行动作期间没有已知的防范条件, 则返回特定类型就足够了. 上述操作不接受任何参数, 因此不需要参数约束验证.
IActionResult 类型
当一个动作中有多个 ActionResult 返回类型时, IActionResult 返回类型是合适的. 这些类型代表各种 HTTP 状态代码. 属于此类别的一些常见返回类型是 BadRequestResult(400),NotFoundResult(404) 和 OkObjectResult(200).
ActionResult <T > 类型
大多数操作都有特定的返回类型. 在操作执行期间可能发生意外情况, 在这种情况下不返回特定类型. 例如, 操作的输入参数可能无法通过模型验证. 在这种情况下, 通常返回适当的 ActionResult 类型而不是特定类型.
来源: https://www.cnblogs.com/ZaraNet/p/10142466.html