前言
从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应。这三种类型都有自己的优点和缺点,但都缺乏满足REST和高可测性的选项。
ASP.NET Core中可用的响应类型包括最近发布的2.2版本
- 具体类型的结果
- IActionResult
- 的ActionResult
最后一个reult选项 ActionResult
文章内容
返回HTTP状态
这是您在WebAPI应用程序开发过程中必须要具备的。虽然可以遵循REST,但是任何程序功能都是由业务需求驱动的。如果由于控制器操作而返回特定类型,您可能偶尔发现的一件事肯定会返回自定义HTTP状态代码。
让我们看看具有特定类型返回的简单操作,并让它们注意比较。
具体类型
[HttpGet("{id}")]
public IEnumerable GetById(int id)
{
if (id>0)
{
return new List()
{
"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 GetById(int id)
{
if (id > 0)
{
return new List()
{
"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()
{
"Value1",
"Value2",
"Value3",
});
}
else if (id < 0)
{
return BadRequest();
}
return NoContent();
}
现在我们可以自由使用我们认为适合的状态代码,以告知客户我们或我们没有任何限制地处理他的请求。使用IAction结果显然比返回特定类型实例更先进,让.NET决定什么是状态代码。
ActionResult
关于状态代码,IActionResult和ActionResult
但是,还有其他方面,ActionResult
[HttpGet("{id}")]
public ActionResult> GetById(int id)
{
if (id > 0)
{
return Ok(new List()
{
"Value1",
"Value2",
"Value3",
});
}
else if (id < 0)
{
return BadRequest();
}
return NoContent();
}
您已经了解了ASP.NET MVC Core WebAPI项目中控制器操作的不同响应类型的一些优缺点。很明显IActionResult和ActionResult
总结
具体类型
如果在执行动作期间没有已知的防范条件,则返回特定类型就足够了。上述操作不接受任何参数,因此不需要参数约束验证。
IActionResult类型
当一个动作中有多个ActionResult返回类型时,IActionResult返回类型是合适的。这些类型代表各种HTTP状态代码。属于此类别的一些常见返回类型是BadRequestResult(400),NotFoundResult(404)和OkObjectResult(200)。
ActionResult 类型
大多数操作都有特定的返回类型。在操作执行期间可能发生意外情况,在这种情况下不返回特定类型。例如,操作的输入参数可能无法通过模型验证。在这种情况下,通常返回适当的
ActionResult
类型而不是特定类型。