WebAPI学习(十一):自定义全局消息返回格式和配置跨域

  1. 新建数据返回模型基类:
    /// <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();
        }
    }
  2. 在program.cs中添加全局返回过滤器:
  3. builder.Services.AddControllers(options =>
    {
        options.SuppressAsyncSuffixInActionNames = true;
        options.Filters.Add(typeof(GlobalExceptionFilter));
        options.Filters.Add(typeof(AppResultFilter));
    
    });
  4. 设置序列化、时间格式等
    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);
  5. 运行项目

    7

  6. 在program.cs中配置跨域服务
    //跨域服务器配置
    builder.Services.AddCors(options =>
        {
            options.AddPolicy("Cors", p =>
            {
                p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
            });
        });
    //跨域中间件
    app.UseCors("Cors");
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容