前言

从.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类型而不是特定类型。

ASP.NET Core WebAPI控制器返回类型的最佳选项的更多相关文章

  1. asp.net mvc Controller控制器返回类型

    ASP.NET MVC包括了执行常见任务的ActionResult类型.这些类型罗列在表5-1中.每个类型都将在随后的小节中详细讨论. 表5-1  动作结果的类型及其说明 动作结果的类型 说    明 ...

  2. asp.net core webapi 日期返回中出现字母T

    全局配置 在Startup文件中修改 // This method gets called by the runtime. Use this method to add services to the ...

  3. ASP.NET Core webapi json 返回时间格式问题

    网站找了几个方案不好使,比如: 1: services.AddMvc().AddJsonOptions(opt => { opt.SerializerSettings.DateFormatStr ...

  4. ASP.NET Core WebApi返回结果统一包装实践

    前言 近期在重新搭建一套基于ASP.NET Core WebAPI的框架,这其中确实带来了不少的收获,毕竟当你想搭建一套框架的时候,你总会不自觉的去想,如何让这套框架变得更完善一点更好用一点.其中在关 ...

  5. ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)

    相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...

  6. asp.net core WebApi 返回 HttpResponseMessage

    ASP.NET WebApi 2 中的示例代码: [Route("values/{id}")] public async Task<HttpResponseMessage&g ...

  7. 【转】ASP.NET Core WebAPI JWT Bearer 认证失败返回自定义数据 Json

    应用场景:当前我们给微信小程序提供服务接口,接口中使用了权限认证这一块,当我使用 JWT Bearer 进行接口权限认证的时候,返回的结果不是我们客户端想要的,其它我们想要给客户端返回统一的数据结构, ...

  8. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

  9. ASP.NET Core WebApi使用Swagger生成api

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

随机推荐

  1. app:利用HBuilder打包webpack项目

    1.安装HBuilder 2.将你的项目在HBuilder中打开 3.控制台 打包编译 npm run build 4.新建一个app项目,将项目编译生成的dist文件夹 ,复制到app项目中 5.双 ...

  2. SpringBoot中对于异常处理的提供的五种处理方式

    1.自定义错误页面 SpringBoot 默认的处理异常机制:SpringBoot默认的已经提供了一套处理异常的机制.一旦程序中出现了异常,SpringBoot会向/error的url发送请求.在Sp ...

  3. Hadoop的数据压缩

    一.Hadoop的数据压缩 1.概述 在进行MR程序的过程中,在Mapper和Reducer端会发生大量的数据传输和磁盘IO,如果在这个过程中对数据进行压缩处理,可以有效的减少底层存储(HDFS)读写 ...

  4. 《团队作业第三、第四周》五小福团队作业--Scrum 冲刺阶段--Day7

    <团队作业第三.第四周>五小福团队作业--Scrum 冲刺阶段--Day7 一.项目燃尽图 二.项目进展 [20172301郭恺第七天的进展] 第七天完成的任务: 代码整合,界面调整为相对 ...

  5. java int数组任何数之间间隔不能对于指定数,内付极速排序

    public static void main(String[] args) { int []arr = {300,310, 210,313,334,360,255,233,275,274,410,5 ...

  6. Windows linux子系统 使用说明

    1.安装 linux 子系统 2.应用商店安装ubuntu 3.为了方便可以配置成默认登陆root账户 Ubuntu config –default-user root   4. 安装完毕   5.安 ...

  7. 一个for实现9*9乘法表

    今天看到别人一个博客提出来一个非常有趣的题目,写一个9*9的乘法表,要求只使用且仅使用一个for来实现9*9乘法表的打印.(不使用if,switch,?:)   可以用任何语言实现,下面是博主给的ja ...

  8. XGBoost原理和公式推导

     本篇文章主要介绍下Xgboost算法的原理和公式推导.关于XGB的一些应用场景在此就不赘述了,感兴趣的同学可以自行google.下面开始: 1.模型构建 构建最优模型的方法一般是最小化训练数据的损失 ...

  9. Angular 2项目的环境配置和项目搭建

    AngularJS2 发布于2016年9月份,它是基于ES6来开发的. AngularJS2 是一款开源JavaScript库,由Google维护,用来协助单一页面应用程序运行.AngularJS2 ...

  10. linux学习:用户管理

    一.管理用户(user) 主要工具命令 useradd    注:添加用户 adduser    注:添加用户 passwd     注:为用户设置密码 usermod    注:修改用户命令,可以通 ...