新建数据返回模型基类:
/// <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);
运行项目:
在program.cs中配置跨域服务:
//跨域服务配置
builder.Services.AddCors(options =>
{
options.AddPolicy("Cors", p =>
{
p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
});
});
配置CORS中间件
app.UseCors("Cors");