- 新建数据返回模型基类:
/// <summary> /// 数据返回模型基类 /// </summary> public class ApiResult { /// <summary> /// 返回状态码 /// </summary> public virtual HttpStatusCode HttpStatus { get; set; } = HttpStatusCode.OK; /// <summary> /// 获取消息内容 /// </summary> public virtual string Message { get; set; } /// <summary> /// 返回数据 /// </summary> public virtual object Data { get; set; } /// <summary> /// 执行时长 /// </summary> public virtual long TimeOut { get; set; } }
在Filter文件夹定义结果过滤器,返回统一数据格式
/// <summary> /// 返回结果过滤器,统一返回数据格式 /// </summary> public class AppResultFilter : Attribute,IActionFilter { /// <summary> /// 请求时长计时开始 /// </summary> private readonly Stopwatch watch = new Stopwatch(); /// <summary> /// 返回结果执行之后 /// </summary> /// <param name="context"></param> public void OnActionExecuted(ActionExecutedContext context) { watch.Stop(); //根据实际需求进行具体实现 if(context.Result is ObjectResult) { var objecResult = context.Result as ObjectResult; if (objecResult.Value == null) { context.Result = new ObjectResult( new ApiResult { HttpStatus = System.Net.HttpStatusCode.NotFound, Message = "未找到资源", TimeOut = watch.ElapsedMilliseconds }); } else { if (objecResult.Value is ApiResult) { var result = (ApiResult)objecResult.Value; result.TimeOut = watch.ElapsedMilliseconds; context.Result = new ObjectResult(result); return; } context.Result = new ObjectResult( new ApiResult { HttpStatus = System.Net.HttpStatusCode.OK, Message = "请求成功", Data = objecResult.Value, TimeOut = watch.ElapsedMilliseconds }); //判读是否返回的是元组 //返回数据并且返回总行数 //public async Task<(List<object>,int)> Paging(PagingBaseRequest parameter) { retuen ( new List<object>{ },1000) } if (objecResult.DeclaredType != null && objecResult.DeclaredType.Name == "ValueTuple`2") { dynamic value = objecResult.Value; if(value.Item1 != null) { if (value.Item1 is int) { //返回元组格式(int,List<object>) context.Result = new ObjectResult( new ApiResult { HttpStatus = System.Net.HttpStatusCode.OK, Message = "请求成功", TimeOut = watch.ElapsedMilliseconds, Data = new { Count = value.Item1, Data = value.Item2 } }); } else context.Result = new ObjectResult( new ApiResult { HttpStatus = System.Net.HttpStatusCode.OK, Message = "请求成功", TimeOut = watch.ElapsedMilliseconds, Data = new { Count = value.Item2, Data = value.Item1 } }); } } } } else if(context.Result is EmptyResult) { context.Result = new ObjectResult( new ApiResult { HttpStatus = System.Net.HttpStatusCode.OK, Message = "请求成功" }); } else if(context.Result is ContentResult) { context.Result = new ObjectResult( new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "", TimeOut = watch.ElapsedMilliseconds, Data = (context.Result as ContentResult).Content }); } else if (context.Result is StatusCodeResult) { context.Result = new ObjectResult(new { HttpStatus = (context.Result as StatusCodeResult).StatusCode, TimeOut = watch.ElapsedMilliseconds, Message = "" }); } else if (context.Result is Exception) { var result = context.Result as Exception; context.Result = new ObjectResult(new { HttpStatus = HttpStatusCode.BadRequest, TimeOut = watch.ElapsedMilliseconds, Message = result.Message }); } } /// <summary> /// 返回结果执行之前 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { watch.Start(); } }
- 在program.cs中添加全局返回过滤器:
-
builder.Services.AddControllers(options => { options.SuppressAsyncSuffixInActionNames = true; options.Filters.Add(typeof(GlobalExceptionFilter)); options.Filters.Add(typeof(AppResultFilter)); });
- 设置序列化、时间格式等
builder.Services.AddControllers(options => { options.SuppressAsyncSuffixInActionNames = true; options.Filters.Add(typeof(GlobalExceptionFilter)); options.Filters.Add(typeof(AppResultFilter)); }).AddNewtonsoftJson(options => { //忽略循环引用 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //不使用驼峰样式的key options.SerializerSettings.ContractResolver = new DefaultContractResolver(); //设置时间格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; //忽略Model中为null的属性 //options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; //设置本地时间而非UTC时间 options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local; }).ConfigureApiBehaviorOptions(options => options.SuppressModelStateInvalidFilter = true);
- 运行项目
- 在program.cs中配置跨域服务
//跨域服务器配置 builder.Services.AddCors(options => { options.AddPolicy("Cors", p => { p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); }); });
//跨域中间件 app.UseCors("Cors");
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容