您的位置:首页 > 其它

.Net Core Mvc/WebApi 返回结果封装

2019-07-11 12:00 627 查看

 

一.背景

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

.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":"操作成功"}

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: