using Furion.DataValidation; using Furion.DependencyInjection; using Furion.UnifyResult; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.ModelBinding; using System; using System.Collections.Generic; using System.Threading.Tasks; using Newtonsoft.Json; namespace Ewide.Core { /// /// 规范化RESTful风格返回值 /// [SuppressSniffer, UnifyModel(typeof(RestfulResult<>))] public class RestfulResultProvider : IUnifyResultProvider { private IActionResult DisplayJson(object data) { return new ContentResult { Content = JsonConvert.SerializeObject(data, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(), DateFormatString = "yyyy-MM-dd HH:mm:ss" }), ContentType = "application/json" }; } /// /// 异常返回值 /// /// /// public IActionResult OnException(ExceptionContext context) { // 解析异常信息 var (StatusCode, ErrorCode, Errors) = UnifyContext.GetExceptionMetadata(context); // 如果是代码自行抛出的异常,视为接口调用成功,返回结果失败 if (context.Exception.GetType() == typeof(Furion.FriendlyException.AppFriendlyException)) { return DisplayJson(new RestfulResult { Code = StatusCodes.Status200OK, Success = false, Data = null, Message = Errors, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); } return DisplayJson(new RestfulResult { Code = StatusCode, Success = false, Data = null, Message = Errors, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); } /// /// 处理输出状态码 /// /// /// /// /// public async Task OnResponseStatusCodes(HttpContext context, int statusCode,UnifyResultStatusCodesOptions options) { switch (statusCode) { // 处理 401 状态码 case StatusCodes.Status401Unauthorized: await context.Response.WriteAsJsonAsync(new RestfulResult { Code = StatusCodes.Status401Unauthorized, Success = false, Data = null, Message = "401 未经授权", Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); break; // 处理 403 状态码 case StatusCodes.Status403Forbidden: await context.Response.WriteAsJsonAsync(new RestfulResult { Code = StatusCodes.Status403Forbidden, Success = false, Data = null, Message = "403 禁止访问", Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); break; default: break; } } /// /// 成功返回值 /// /// /// public IActionResult OnSucceeded(ActionExecutedContext context) { object data; // 处理内容结果 if (context.Result is ContentResult contentResult) data = contentResult.Content; // 处理对象结果 else if (context.Result is ObjectResult objectResult) data = objectResult.Value; else if (context.Result is EmptyResult) data = null; else return null; return DisplayJson(new RestfulResult { Code = context.Result is EmptyResult ? StatusCodes.Status204NoContent : StatusCodes.Status200OK, // 处理没有返回值情况 204 Success = true, Data = data, Message = "请求成功", Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); } /// /// 验证失败返回值 /// /// /// /// /// /// public IActionResult OnValidateFailed(ActionExecutingContext context, ModelStateDictionary modelStates, IEnumerable validationResults, string validateFailedMessage) { return DisplayJson(new RestfulResult { Code = StatusCodes.Status400BadRequest, Success = false, Data = null, Message = validationResults, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); } } /// /// RESTful风格---XIAONUO返回格式 /// /// [SuppressSniffer] public class RestfulResult { /// /// 执行成功 /// public bool Success { get; set; } /// /// 状态码 /// public int? Code { get; set; } /// /// 错误信息 /// public object Message { get; set; } /// /// 数据 /// public T Data { get; set; } /// /// 附加数据 /// public object Extras { get; set; } /// /// 时间戳 /// public long Timestamp { get; set; } } }