using Furion.FriendlyException; using Furion.UnifyResult; using Furion; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc; using System; using System.Threading.Tasks; using Furion.DataValidation; using cylsg.Authorization; namespace cylsg.Web.Core.Handlers { /// /// 统一返回结果 /// [UnifyModel(typeof(EzCoreResultMode<>))] internal class EzCoreRESTFulResultProvider : IUnifyResultProvider { /// /// 异常返回值 /// /// /// /// public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) { //if (context is TAxiosException) // return new JsonResult(new JsonResult(TAxiosFulResult((int)((TAxios.Utility.TAxiosException)context.Exception).StatusCode, Code: 0, data: metadata.Data, errors: metadata.Errors) // , UnifyContext.GetSerializerSettings(context))); var ex = context.Exception as EZCoreException; if (ex != null) { //如果是异常特殊抛出的异常,这里需要处理状态码 context.HttpContext.Response.StatusCode = (int)ex.StatusCode; } return new JsonResult(EzCoreFulResult(metadata.StatusCode, Code: 0, data: metadata.Data, errors: metadata.Errors) , UnifyContext.GetSerializerSettings(context)); // 当前行仅限 Furion 4.6.6+ 使用 } /// /// 成功返回值 /// /// /// /// public IActionResult OnSucceeded(ActionExecutedContext context, object data) { return new JsonResult(EzCoreFulResult(StatusCodes.Status200OK, 1, data) , UnifyContext.GetSerializerSettings(context)); // 当前行仅限 Furion 4.6.6+ 使用 } /// /// 验证失败返回值 /// /// /// /// public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) { //设置返回状态码 return new JsonResult(EzCoreFulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, Code: 0, data: metadata.Data, errors: metadata.ValidationResult) , UnifyContext.GetSerializerSettings(context)); // 当前行仅限 Furion 4.6.6+ 使用 } /// /// 特定状态码返回值 OnResponseStatusCodes /// /// /// /// /// public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings) { // 设置响应状态码 UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings); switch (statusCode) { // 处理 401 状态码 case StatusCodes.Status401Unauthorized: context.Response.StatusCode = statusCode; await context.Response.WriteAsJsonAsync(EzCoreFulResult(statusCode, Code: 0, errors: "401 Unauthorized") , App.GetOptions()?.JsonSerializerOptions); break; // 处理 403 状态码 转换为401状态码 case StatusCodes.Status403Forbidden: context.Response.StatusCode = StatusCodes.Status401Unauthorized; await context.Response.WriteAsJsonAsync(EzCoreFulResult(statusCode, Code: 0, errors: "403 Forbidden") , App.GetOptions()?.JsonSerializerOptions); break; default: break; } } /// /// 返回 RESTful 风格结果集 /// /// /// 成功状态码 /// /// /// private static EzCoreResultMode EzCoreFulResult(int statusCode, int Code = 1, object data = default, object errors = default) { return new EzCoreResultMode { Code = Code, StatusCode = statusCode, Data = data, Error = errors, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }; } public IActionResult OnAuthorizeException(DefaultHttpContext context, ExceptionMetadata metadata) { throw new NotImplementedException(); } } /// /// 统一返回类型模型定义 /// /// public class EzCoreResultMode { /// /// 标准状态码 /// public int? StatusCode { get; set; } /// /// 状态码 /// public int? Code { get; set; } /// /// 数据 /// public T? Data { get; set; } /// /// 错误信息 /// public object Error { get; set; } /// /// 附加数据 /// public object Extras { get; set; } /// /// 时间戳 /// public long? Timestamp { get; set; } /// /// 其他消息 /// public string Message { get; set; } } }