using Furion.DataValidation; using Furion.DependencyInjection; using Furion.FriendlyException; using Furion.UnifyResult; //using Furion.UnifyResult.Internal; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System.Net; using Yw.Untity; using Yw.Application; using Yw.Dto; using System.Text.Json.Serialization; using System.Text.Json; using IStation.WebApi; namespace IStation.WebApi { /// /// 规范化RESTful风格返回值 /// [SuppressSniffer, UnifyModel(typeof(Result<>))] public class XnRestfulResultProvider : IUnifyResultProvider { /// /// 异常 /// public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) { // 解析异常信息 //var exceptionMetadata = UnifyContext.GetExceptionMetadata(context); Result result = null; //furion异常 if (context.Exception is AppFriendlyException friendException) { result = new Result { Code = eResultCode.Alert, Error = friendException.ErrorCode, Message = friendException.ErrorMessage, Data = null, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }; } //api异常 else if (context.Exception is InternalException apiException) { result = new Result { Code = apiException.ResultCode, Error = apiException.ErrorCode, Message = apiException.ErrorMsg, Data = apiException.LogicData, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }; } else { result = new Result { Code = eResultCode.Error, Error = "系统异常", Message = context.Exception.StackTrace, Data = null, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }; } if (result.Code == eResultCode.Error) { Yw.LogHelper.Error($"错误码:{result.Error},错误信息:{result.Message}"); } return new JsonResult(result); } /// /// 成功 /// public IActionResult OnSucceeded(ActionExecutedContext context, object data) { //执行顺序 5 线程8 switch (context.Result) { // 处理内容结果 case ContentResult contentResult: data = contentResult.Content; break; // 处理对象结果 case ObjectResult objectResult: data = objectResult.Value; break; case EmptyResult: data = null; break; default: return null; } return new JsonResult(new Result { Code = eResultCode.Success, Error = null, Message = "请求成功", Data = data, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }); } /// /// 验证失败 /// public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) { return new JsonResult(new Result { Code = eResultCode.Prompt, Error = InternalErrorCodes.V001.ToString(), Message = metadata.Message, Data = null, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }); } /// /// 响应状态码 /// public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = null) { // 设置响应状态码 UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings); var options = new JsonSerializerOptions(); options.PropertyNamingPolicy = null; //返回属性大小写问题 options.ReferenceHandler = ReferenceHandler.IgnoreCycles; //忽略循环引用 仅.NET 6支持 options.Converters.Add(new DateTimeJsonConverter());//时间格式处理 options.Converters.Add(new DateTimeNullableJsonConverter());//时间格式处理 options.Converters.Add(new LongJsonConverter());//长整型格式处理 options.Converters.Add(new LongNullableJsonConverter());//长整型格式处理 if (Enum.IsDefined(typeof(HttpStatusCode), (HttpStatusCode)statusCode)) { await context.Response.WriteAsJsonAsync(new Result { Code = eResultCode.Confirm, Error = InternalErrorCodes.A099.ToString(), Message = "权限验证失败", Data = null, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }, options); } } } }