.Net Core Mvc/WebApi 返回结果封装
一.背景
为了方便开发,简化代码,也为了与前端方便对接,需要对接口服务返回结果进行统一处理.
.Net Core 中返回结果的处理与 .Net Framework 中的处理不一样.
.Net Core 返回结果处理继承自 ActionFilterAttribute , OnActionExecuted 的参数为 ActionExecutedContext.
我们需要对之前的处理进行修改.
二.封装
1.首先定义一个统一返回结果类
我们需要定义一个统一返回结果类ReturnObject简写为Robj
约定返回结果Code
/// <summary>
/// 返回Code
/// </summary>
public enum RCode
{
/// <summary>
/// 成功
/// </summary>
[JsonProperty("")]
Success = , /// <summary>
/// 登录超时,需重新登录
/// </summary>
[JsonProperty("")]
NeedLogin = , /// <summary>
/// 程序异常
/// </summary>
[JsonProperty("")]
Exception = , /// <summary>
/// 系统错误
/// </summary>
[JsonProperty("")]
SysError =
}
返回结果对象类
/// <summary>
/// 返回结果对象
/// ReturnObject Robj
/// 默认RCode为成功,Message为成功.
/// </summary>
/// <typeparam name="T"></typeparam>
public class Robj<T>
{
T result = default(T);
RCode code = RCode.Success;
string message = "操作成功"; /// <summary>
/// 结果
/// </summary>
public T Result
{
get { return result; }
set { result = value; }
}
/// <summary>
/// 执行结果
/// </summary>
public RCode Code
{
get { return code; }
set { code = value; }
}
/// <summary>
/// 提示消息
/// </summary>
public string Message
{ get { return message; } set { message = value; } } /// <summary>
/// 成功
/// </summary>
/// <param name="result">返回结果</param>
/// <param name="msg">提示消息</param>
public void Success(T result,string msg = "操作成功")
{
this.code = RCode.Success;
this.result = result;
this.Message = msg;
} /// <summary>
/// 异常
/// </summary>
/// <param name="msg">提示消息</param>
/// <param name="code"></param>
public void Error(string msg,RCode code = RCode.Exception)
{
this.code = code;
this.Message = msg;
}
}
2.添加返回结果处理Filter
说一下NoPackageResultAttribute特性
/// <summary>
/// 标识不对返回的结果进行封装处理
/// </summary>
public class NoPackageResultAttribute : Attribute
{
}
之前 .net Framework WebApi时,需要添加一个NoPackageResultAttribute,以处理接口不需要进行统一封装时使用.比如下载文件接口.
现在 .net Core 中已经不需要了.
下面开始添加对返回结果进行处理的Filter,Filter继承自ActionFilterAttribute,重写OnActionExecuted方法.
/// <summary>
/// ApiResult封装
/// </summary>
public class ApiResultFilter : ActionFilterAttribute
{
/// <summary>
/// Action执行完成,返回结果处理
/// </summary>
/// <param name="actionExecutedContext"></param>
public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Exception == null)
{ //执行成功 取得由 API 返回的资料
ObjectResult result = actionExecutedContext.Result as ObjectResult;
if (result != null)
{ // 重新封装回传格式
Robj<object> robj = new Robj<object>();
robj.Success(result.Value);
ObjectResult objectResult = new ObjectResult(robj);
actionExecutedContext.Result = objectResult;
}
}
base.OnActionExecuted(actionExecutedContext);
}
}
重点说明下:
(1)此处只处理Exception为Null即非异常情况.异常结果处理在另一个ExceptionHandlingMiddleware中做统一处理.
(2)只处理actionExecutedContext.Result为ObjectResult且不为Null的情况.
这样就不会对返回的其它ActionResult进行处理.比如FileResult,ContentResult,JsonResult等.
如果不需要封装的时候,只要接口返回你想要的IActionResult即可.
所以上面第一步的NoPackageResultAttribute特性在.net Core中可以不使用了.
3.完整代码如下
/// <summary>
/// ApiResult封装
/// </summary>
public class ApiResultFilter : ActionFilterAttribute
{
/// <summary>
/// Action执行完成,返回结果处理
/// </summary>
/// <param name="actionExecutedContext"></param>
public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Exception == null)
{ //执行成功 取得由 API 返回的资料
ObjectResult result = actionExecutedContext.Result as ObjectResult;
if (result != null)
{ // 重新封装回传格式
Robj<object> robj = new Robj<object>();
robj.Success(result.Value);
ObjectResult objectResult = new ObjectResult(robj);
actionExecutedContext.Result = objectResult;
}
}
base.OnActionExecuted(actionExecutedContext);
}
} /// <summary>
/// 返回结果对象
/// ReturnObject Robj
/// 默认RCode为成功,Message为成功.
/// </summary>
/// <typeparam name="T"></typeparam>
public class Robj<T>
{
T result = default(T);
RCode code = RCode.Success;
string message = "操作成功"; /// <summary>
/// 结果
/// </summary>
public T Result
{
get { return result; }
set { result = value; }
}
/// <summary>
/// 执行结果
/// </summary>
public RCode Code
{
get { return code; }
set { code = value; }
}
/// <summary>
/// 提示消息
/// </summary>
public string Message
{ get { return message; } set { message = value; } } /// <summary>
/// 成功
/// </summary>
/// <param name="result">返回结果</param>
/// <param name="msg">提示消息</param>
public void Success(T result,string msg = "操作成功")
{
this.code = RCode.Success;
this.result = result;
this.Message = msg;
} /// <summary>
/// 异常
/// </summary>
/// <param name="msg">提示消息</param>
/// <param name="code"></param>
public void Error(string msg,RCode code = RCode.Exception)
{
this.code = code;
this.Message = msg;
}
} /// <summary>
/// 返回Code
/// </summary>
public enum RCode
{
/// <summary>
/// 成功
/// </summary>
[JsonProperty("")]
Success = , /// <summary>
/// 登录超时,需重新登录
/// </summary>
[JsonProperty("")]
NeedLogin = , /// <summary>
/// 程序异常
/// </summary>
[JsonProperty("")]
Exception = , /// <summary>
/// 系统错误
/// </summary>
[JsonProperty("")]
SysError =
}
4.使用Filter
在StartUp ConfigureServices方法中引入Filter
services.AddMvc(options =>
{ //加入返回结果处理
options.Filters.Add<ApiResultFilter>();
})
5.返回结果
查看返回结果如下:
{"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 返回结果封装的更多相关文章
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- 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的返回值自动进行各种序列化处理(序列化为 ...
- ASP.NET Core MVC/WebAPi 模型绑定探索 转载https://www.cnblogs.com/CreateMyself/p/6246977.html
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- 【转】ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- ASP.NET Core MVC/WebAPi如何构建路由?
前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾A ...
- ASP.NET Core Mvc中空返回值的处理方式
原文地址:https://www.strathweb.com/2018/10/convert-null-valued-results-to-404-in-asp-net-core-mvc/ 作者: F ...
- 你所不知道的ASP.NET Core MVC/WebApi基础系列(二)
前言 好久没冒泡了,算起来估计有快半年没更新博客了,估计是我第一次停更如此之久,人总有懒惰的时候,时间越长越懒惰,但是呢,不学又不行,持续的惰性是不行dei,要不然会被时光所抛弃,技术所淘汰,好吧,进 ...
- 你所不知道的ASP.NET Core MVC/WebApi基础系列(一)
前言 最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时间也是一直在看ASP.NET Core的内容,所以后续会穿插讲EF Core和ASP.NET Core,别认为你会 ...
- 你所不知道的ASP.NET Core MVC/WebApi基础系列 (二)
转自博客:https://www.cnblogs.com/CreateMyself/p/10604293.html 前言 本节内容,我们来讲讲.NET Core当中的模型绑定系统.模型绑定原理.自定义 ...
随机推荐
- JMS与消息队列
JMS,Java Message Service,即Java消息服务. MOM,Message Oriented Miiddleware的英文缩写,指的是利用高效可靠的消息传递机制进行平台无关的数据交 ...
- ubuntu下如何开机自动执行自定义脚本?
答: 将自定义脚本(假设自定义的脚本绝对路径为~/start_test.sh)添加到/etc/init.d/目录下,并更新系统启动项,命令如下: sudo cp ~/start_test.sh /et ...
- datax实例——全量、增量同步
一.全量同步 本文以mysql -> mysql为示例: 本次测试的表为mysql的系统库-sakila中的actor表,由于不支持目的端自动建表,此处预先建立目的表: CREATE TABLE ...
- Spring cloud微服务安全实战-3-8API安全机制之Https
Https访问 1.验证双方的身份. 2.一旦建立连接,对数据进行封装加密 这里先生成一个自己自签的证书,不是第三方颁发的,第三方颁发的要花钱. 第二是做一些配置,让程序支持https 安装了java ...
- 【445】Markdown Syntax
ref: Markdown基本语法 ref: Markdown Guide ref: Markdown Cheatsheet ref: Markdown Tutorial Lists Basic Sy ...
- 报错:WARN [WorkerSender[myid=1]:QuorumCnxManager@584] - Cannot open channel to 2 at election address /x.x.x.x:3888
报错背景: zookeeper安装完成之后,启动之后正常,但是查看log文件zookeeper.log时发现报错. 报错现象: -- ::, [myid:] - INFO [WorkerSender[ ...
- 报错:org.apache.sqoop.common.SqoopException Message: CLIENT_0001:Server has returned exception NoClassDefFoundError: org/codehaus/jackson/map/JsonMappingException
报错背景: CDH集成sqoop2服务之后,创建好link和job之后,执行job的时候报错. 报错现象: sqoop:> start job -j Exception has occurred ...
- Python - Django - ORM 一对一表结构
当一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁,可以把不怎么常用的字段 单独拿出来做成一张表,然后用一对一的表关联起来 这样既保证数据都完整的保存下来,又能保证检索更快 model ...
- numpy包中,与线性代数相关的模块——linalg(利那隔)
https://github.com/scalanlp/breeze/wiki/Linear-Algebra-Cheat-Sheethttps://docs.scipy.org/doc/numpy-1 ...
- 常见问题:计算机网络/运输层/UDP
几乎不对IP增加其他东西,无连接. 优势 速度快.适合实时. 无连接建立,没有连接时延. 无连接状态. 分组首部开销小.TCP需20字节,UDP仅需8字节. 使用UDP的协议 DNS SNMP RIP ...