0
点赞
收藏
分享

微信扫一扫

.Net Core6.0 WebAPI项目框架搭建十一:自定义全局消息返回格式和配置跨域

新建数据返回模型基类:

/// <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 OnActionExecuting(ActionExecutingContext context)
        {
            watch.Start();//开始  
        }
 
        /// <summary>
        /// 返回结果执行之后
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {
 
            watch.Stop();
            //根据实际需求进行具体实现
            if (context.Result is ObjectResult)
            {
                var objectResult = context.Result as ObjectResult;
                if (objectResult.Value == null)
                {
                    context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.NotFound, Message = "未找到资源", TimeOut = watch.ElapsedMilliseconds });
                }
                else
                {
                    if (objectResult.Value is ApiResult)
                    {
                        var result = (ApiResult)objectResult.Value;
                        result.TimeOut = watch.ElapsedMilliseconds;
                        context.Result = new ObjectResult(result);
                        return;
                    }
                    context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "请求成功", Data = objectResult.Value, TimeOut = watch.ElapsedMilliseconds });
                    //判读是否返回的是元组
                    //返回数据并且返回总行数 public async Task<(List<object>,int)> Paging(PagingBaseRequest parameter) { retuen ( new List<object>{ },1000) }
                    if (objectResult.DeclaredType != null && objectResult.DeclaredType.Name == "ValueTuple`2")
                    {
                        dynamic value = objectResult.Value;
                        if (value.Item1 != null)
                        {
                            if (value.Item1 is int)
                            {
                                //返回元组格式(int,List<object>)
                                context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "请求成功", TimeOut = watch.ElapsedMilliseconds, Data = new { Count = value.Item1, Data = value.Item2 } });
                            }
                            else
                                //返回元组格式(List<object>,int)
                                context.Result = new ObjectResult(new ApiResult { HttpStatus = 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 = 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 });
            }
        }
 
    }

在program.cs中添加全局返回过滤器:

builder.Services.AddControllers(options =>
{
    options.SuppressAsyncSuffixInActionNames = false;
    options.Filters.Add(typeof(GlobalExceptionsFilter));
    options.Filters.Add(typeof(AppResultFilter));
});

设置序列化、时间格式等

builder.Services.AddControllers(options =>
{
    options.SuppressAsyncSuffixInActionNames = false;
    options.Filters.Add(typeof(GlobalExceptionsFilter));
    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);

运行项目:

.Net Core6.0 WebAPI项目框架搭建十一:自定义全局消息返回格式和配置跨域_Data

在program.cs中配置跨域服务:

//跨域服务配置
builder.Services.AddCors(options =>
{
    options.AddPolicy("Cors", p =>
    {
        p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
    });
});

 配置CORS中间件

app.UseCors("Cors");

举报

相关推荐

0 条评论