.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("1000")] Success = 1000, /// <summary> /// 登录超时,需重新登录 /// </summary> [JsonProperty("2000")] NeedLogin = 2000, /// <summary> /// 程序异常 /// </summary> [JsonProperty("3000")] Exception = 3000, /// <summary> /// 系统错误 /// </summary> [JsonProperty("4000")] SysError = 4000 }View Code
返回结果对象类
/// <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; } }View Code
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); } }View Code
重点说明下:
(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("1000")] Success = 1000, /// <summary> /// 登录超时,需重新登录 /// </summary> [JsonProperty("2000")] NeedLogin = 2000, /// <summary> /// 程序异常 /// </summary> [JsonProperty("3000")] Exception = 3000, /// <summary> /// 系统错误 /// </summary> [JsonProperty("4000")] SysError = 4000 }View Code
4.使用Filter
在StartUp ConfigureServices方法中引入Filter
services.AddMvc(options => { //加入返回结果处理 options.Filters.Add<ApiResultFilter>(); })
5.返回结果
查看返回结果如下:
{"result":{"id":"9e8e9a12-1a9b-4856-b15f-cd8debc3fb44","userName":"test","nickName":"测试","roleType":2,"userStatus":1,"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":1000,"message":"操作成功"}
- ASP.NET Core MVC/WebAPi 模型绑定探索
- ASP.NET Core MVC/WebAPi 模型绑定
- ASP.NET Core MVC/WebAPi 模型绑定探索
- ASP.NET Core WebApi 返回统一格式参数
- .net mvc web api 返回 json 内容,过滤值为null的属性
- ASP.NET Core MVC/WebApi基础系列2
- .net web api返回结果为json
- ASP.NET Core MVC/WebApi基础系列1
- ASP.NET MVC ApiController过滤器处理返回结果
- ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)
- asp.net core webapi 日期返回中出现字母T
- ASP.NET Core MVC/WebAPi 模型绑定探索(转载)
- ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
- Asp.net Core WebApi 支持json/xml格式的数据返回
- 详解ASP.NET Core WebApi 返回统一格式参数
- Asp.net Core WebApi 返回JSON自动驼峰格式化问题
- ASP.NET Core WebAPI控制器返回类型的最佳选项
- 详解ASP.NET Core WebApi 返回统一格式参数
- .net mvc web api 返回 json 内容,过滤值为null的属性
- .net webapi控制器函数中与MVC控制器函数中,获取到请求中的文本内容和文件流内容的写法