前言
从.NET Core 2.1版开始,到目前为止,控制器操做能够返回三种类型的WebApi响应。这三种类型都有本身的优势和缺点,但都缺少知足REST和高可测性的选项。 单元测试
ASP.NET Core中可用的响应类型包括最近发布的2.2版本测试
- 具体类型的结果
- IActionResult
- 的ActionResult <T>
最后一个reult选项 ActionResult <T>是在.NET Core 2.1中引入的。我将使用一个简单的例子来比较使用这三个控制器动做响应类型选项的优缺点。spa
文章内容
返回HTTP状态
这是您在WebAPI应用程序开发过程当中必需要具有的。虽然能够遵循REST,可是任何程序功能都是由业务需求驱动的。若是因为控制器操做而返回特定类型,您可能偶尔发现的一件事确定会返回自定义HTTP状态代码。3d
让咱们看看具备特定类型返回的简单操做,并让它们注意比较。code
具体类型
[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的测试结果图,请参考。blog
若是没有数据,咱们将会有一个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状态代码进行响应,这将是模型验证的状况。使用不一样的状态代码并非那么直接,而且您有多条线负责正确的响应,这与其余两种返回类型不一样。string
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
类型而不是特定类型。