一.背景

为了方便开发,简化代码,也为了与前端方便对接,需要对接口服务返回结果进行统一处理.

.Net Core 中返回结果的处理与 .Net Framework 中的处理不一样.

.Net Core 返回结果处理继承自 ActionFilterAttribute , OnActionExecuted 的参数为 ActionExecutedContext.

我们需要对之前的处理进行修改.

二.封装

1.首先定义一个统一返回结果类

我们需要定义一个统一返回结果类ReturnObject简写为Robj

约定返回结果Code

  1. /// <summary>
  2. /// 返回Code
  3. /// </summary>
  4. public enum RCode
  5. {
  6. /// <summary>
  7. /// 成功
  8. /// </summary>
  9. [JsonProperty("")]
  10. Success = ,
  11.  
  12. /// <summary>
  13. /// 登录超时,需重新登录
  14. /// </summary>
  15. [JsonProperty("")]
  16. NeedLogin = ,
  17.  
  18. /// <summary>
  19. /// 程序异常
  20. /// </summary>
  21. [JsonProperty("")]
  22. Exception = ,
  23.  
  24. /// <summary>
  25. /// 系统错误
  26. /// </summary>
  27. [JsonProperty("")]
  28. SysError =
  29. }

返回结果对象类

  1. /// <summary>
  2. /// 返回结果对象
  3. /// ReturnObject Robj
  4. /// 默认RCode为成功,Message为成功.
  5. /// </summary>
  6. /// <typeparam name="T"></typeparam>
  7. public class Robj<T>
  8. {
  9. T result = default(T);
  10. RCode code = RCode.Success;
  11. string message = "操作成功";
  12.  
  13. /// <summary>
  14. /// 结果
  15. /// </summary>
  16. public T Result
  17. {
  18. get { return result; }
  19. set { result = value; }
  20. }
  21. /// <summary>
  22. /// 执行结果
  23. /// </summary>
  24. public RCode Code
  25. {
  26. get { return code; }
  27. set { code = value; }
  28. }
  29. /// <summary>
  30. /// 提示消息
  31. /// </summary>
  32. public string Message
  33. { get { return message; } set { message = value; } }
  34.  
  35. /// <summary>
  36. /// 成功
  37. /// </summary>
  38. /// <param name="result">返回结果</param>
  39. /// <param name="msg">提示消息</param>
  40. public void Success(T result,string msg = "操作成功")
  41. {
  42. this.code = RCode.Success;
  43. this.result = result;
  44. this.Message = msg;
  45. }
  46.  
  47. /// <summary>
  48. /// 异常
  49. /// </summary>
  50. /// <param name="msg">提示消息</param>
  51. /// <param name="code"></param>
  52. public void Error(string msg,RCode code = RCode.Exception)
  53. {
  54. this.code = code;
  55. this.Message = msg;
  56. }
  57. }

2.添加返回结果处理Filter

说一下NoPackageResultAttribute特性

  1. /// <summary>
  2. /// 标识不对返回的结果进行封装处理
  3. /// </summary>
  4. public class NoPackageResultAttribute : Attribute
  5. {
  6. }

之前 .net Framework WebApi时,需要添加一个NoPackageResultAttribute,以处理接口不需要进行统一封装时使用.比如下载文件接口.

现在 .net Core 中已经不需要了.

下面开始添加对返回结果进行处理的Filter,Filter继承自ActionFilterAttribute,重写OnActionExecuted方法.

  1. /// <summary>
  2. /// ApiResult封装
  3. /// </summary>
  4. public class ApiResultFilter : ActionFilterAttribute
  5. {
  6. /// <summary>
  7. /// Action执行完成,返回结果处理
  8. /// </summary>
  9. /// <param name="actionExecutedContext"></param>
  10. public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
  11. {
  12. if (actionExecutedContext.Exception == null)
  13. { //执行成功 取得由 API 返回的资料
  14. ObjectResult result = actionExecutedContext.Result as ObjectResult;
  15. if (result != null)
  16. { // 重新封装回传格式
  17. Robj<object> robj = new Robj<object>();
  18. robj.Success(result.Value);
  19. ObjectResult objectResult = new ObjectResult(robj);
  20. actionExecutedContext.Result = objectResult;
  21. }
  22. }
  23. base.OnActionExecuted(actionExecutedContext);
  24. }
  25. }

重点说明下:

(1)此处只处理Exception为Null即非异常情况.异常结果处理在另一个ExceptionHandlingMiddleware中做统一处理.

(2)只处理actionExecutedContext.Result为ObjectResult且不为Null的情况.

这样就不会对返回的其它ActionResult进行处理.比如FileResult,ContentResult,JsonResult等.

如果不需要封装的时候,只要接口返回你想要的IActionResult即可.

 所以上面第一步的NoPackageResultAttribute特性在.net Core中可以不使用了.

3.完整代码如下

  1. /// <summary>
  2. /// ApiResult封装
  3. /// </summary>
  4. public class ApiResultFilter : ActionFilterAttribute
  5. {
  6. /// <summary>
  7. /// Action执行完成,返回结果处理
  8. /// </summary>
  9. /// <param name="actionExecutedContext"></param>
  10. public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
  11. {
  12. if (actionExecutedContext.Exception == null)
  13. { //执行成功 取得由 API 返回的资料
  14. ObjectResult result = actionExecutedContext.Result as ObjectResult;
  15. if (result != null)
  16. { // 重新封装回传格式
  17. Robj<object> robj = new Robj<object>();
  18. robj.Success(result.Value);
  19. ObjectResult objectResult = new ObjectResult(robj);
  20. actionExecutedContext.Result = objectResult;
  21. }
  22. }
  23. base.OnActionExecuted(actionExecutedContext);
  24. }
  25. }
  26.  
  27. /// <summary>
  28. /// 返回结果对象
  29. /// ReturnObject Robj
  30. /// 默认RCode为成功,Message为成功.
  31. /// </summary>
  32. /// <typeparam name="T"></typeparam>
  33. public class Robj<T>
  34. {
  35. T result = default(T);
  36. RCode code = RCode.Success;
  37. string message = "操作成功";
  38.  
  39. /// <summary>
  40. /// 结果
  41. /// </summary>
  42. public T Result
  43. {
  44. get { return result; }
  45. set { result = value; }
  46. }
  47. /// <summary>
  48. /// 执行结果
  49. /// </summary>
  50. public RCode Code
  51. {
  52. get { return code; }
  53. set { code = value; }
  54. }
  55. /// <summary>
  56. /// 提示消息
  57. /// </summary>
  58. public string Message
  59. { get { return message; } set { message = value; } }
  60.  
  61. /// <summary>
  62. /// 成功
  63. /// </summary>
  64. /// <param name="result">返回结果</param>
  65. /// <param name="msg">提示消息</param>
  66. public void Success(T result,string msg = "操作成功")
  67. {
  68. this.code = RCode.Success;
  69. this.result = result;
  70. this.Message = msg;
  71. }
  72.  
  73. /// <summary>
  74. /// 异常
  75. /// </summary>
  76. /// <param name="msg">提示消息</param>
  77. /// <param name="code"></param>
  78. public void Error(string msg,RCode code = RCode.Exception)
  79. {
  80. this.code = code;
  81. this.Message = msg;
  82. }
  83. }
  84.  
  85. /// <summary>
  86. /// 返回Code
  87. /// </summary>
  88. public enum RCode
  89. {
  90. /// <summary>
  91. /// 成功
  92. /// </summary>
  93. [JsonProperty("")]
  94. Success = ,
  95.  
  96. /// <summary>
  97. /// 登录超时,需重新登录
  98. /// </summary>
  99. [JsonProperty("")]
  100. NeedLogin = ,
  101.  
  102. /// <summary>
  103. /// 程序异常
  104. /// </summary>
  105. [JsonProperty("")]
  106. Exception = ,
  107.  
  108. /// <summary>
  109. /// 系统错误
  110. /// </summary>
  111. [JsonProperty("")]
  112. SysError =
  113. }

4.使用Filter

在StartUp ConfigureServices方法中引入Filter

  1. services.AddMvc(options =>
  2. { //加入返回结果处理
  3. options.Filters.Add<ApiResultFilter>();
  4. })

5.返回结果

查看返回结果如下:

  1. {"result":{"id":"9e8e9a12-1a9b-4856-b15f-cd8debc3fb44","userName":"test","nickName":"测试","roleType":,"userStatus":,"addUser":"909f2444-f625-4469-8bfb-353e999944ad","addDate":"2019-05-14 00:00:00","lastLoginToken":"e68f1765-7a7e-439b-aa55-c2491516d886","lastLoginTime":"2019-07-11 12:12:44","lastLoginIp":"127.0.0.1"},"code":,"message":"操作成功"}

.Net Core Mvc/WebApi 返回结果封装的更多相关文章

  1. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  2. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

  3. ASP.NET Core MVC/WebAPi 模型绑定探索 转载https://www.cnblogs.com/CreateMyself/p/6246977.html

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  4. 【转】ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  5. ASP.NET Core MVC/WebAPi如何构建路由?

    前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾A ...

  6. ASP.NET Core Mvc中空返回值的处理方式

    原文地址:https://www.strathweb.com/2018/10/convert-null-valued-results-to-404-in-asp-net-core-mvc/ 作者: F ...

  7. 你所不知道的ASP.NET Core MVC/WebApi基础系列(二)

    前言 好久没冒泡了,算起来估计有快半年没更新博客了,估计是我第一次停更如此之久,人总有懒惰的时候,时间越长越懒惰,但是呢,不学又不行,持续的惰性是不行dei,要不然会被时光所抛弃,技术所淘汰,好吧,进 ...

  8. 你所不知道的ASP.NET Core MVC/WebApi基础系列(一)

    前言 最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时间也是一直在看ASP.NET Core的内容,所以后续会穿插讲EF Core和ASP.NET Core,别认为你会 ...

  9. 你所不知道的ASP.NET Core MVC/WebApi基础系列 (二)

    转自博客:https://www.cnblogs.com/CreateMyself/p/10604293.html 前言 本节内容,我们来讲讲.NET Core当中的模型绑定系统.模型绑定原理.自定义 ...

随机推荐

  1. (信贷风控八)行为评分卡模型(B卡)的介绍

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  2. 003 接触elasticsearch的Restful Api【快速入门】

    在学习的时候,直接参看网上的材料,总是会有各种问题,也可能是版本的问题的差异,也可能是本来就有问题,所以,当存在问题的时候从官网的文档上进行学习. 其中7.2版本的文档是:https://www.el ...

  3. 完美解决Cannot download "https://github.com/sass/node-sass/releases/download/binding.nod的问题

    ①:例如很多人第一步就会这样做: 出现:Cannot download "https://github.com/sass/node-sass/releases/download/版本号/XX ...

  4. ubuntu上安装python的ldap模块

    首先安装 apt-get install libldap2-dev 然后再安装 apt-get install libsasl2-dev 然后就可以继续安装你的python-ldap模块了 pip i ...

  5. percona mysql5.7进程出现大量unauthenticated user解决记录

    现象:http://task.chinasoft.com.wx/ 所有任务能打开,我的任务打开很慢 有些人能用,有些人不能用,数据库出现大量的未认证用户连接,连接数利用率超过70% 重启nginx,a ...

  6. Selenium踩坑记之iFrame的定位与切换

    转自:https://www.jianshu.com/p/6e7d0359e4bb Selenium是浏览器自动化测试的工具之一,用过的人都懂他的好,也被他坑的不要不要的.今天就聊聊Selenium的 ...

  7. 十一、LoadRunner组成和工作原理

    一.LoadRunner组成 虚拟用户发生器:Vuser Generator 压力调度和监控中心:Controller 压力生产器:Load Generator 压力结果分析工具:Analysis

  8. QDateTime获取当前时间的时间戳

    QdateTime获取当前时间的时间戳作为图片名 QDateTime qdt1 = QDateTime::currentDateTime();QString timeStr = qdt1.toStri ...

  9. windows驱动程序中的预处理含义

    #pragma  code_seg(“PAGE”) 作用是将此部分代码放入分页内存中运行. #pragma  code_seg() 将代码段设置为默认的代码段 #pragma  code_seg(&q ...

  10. Fastjson 序列化与反序列化

    JSON这个类是fastjson API的入口,主要的功能都通过这个类提供. 序列化API // 将Java对象序列化为JSON字符串,支持各种各种Java基本类型和JavaBean public s ...