using Furion.DataValidation; using Furion.DependencyInjection; using Furion.UnifyResult; using Furion.UnifyResult.Internal; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Nirvana.Common.ApiBase; namespace YBDevice.Web.Handler { /// /// RESTFUL 风格返回值 /// [SuppressSniffer, UnifyModel(typeof(RESTfulResult<>))] public class RESTfulResultProvider : IUnifyResultProvider { /// /// 异常返回值 /// /// /// public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) { //解析异常信息 var ErrorCode = metadata.ErrorCode; var StatusCode = metadata.StatusCode; var Errors = metadata.Errors; 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 JsonResult jsonResult) data = jsonResult.Value; else if (context.Result is EmptyResult) data = null; else data = null; return new JsonResult(data); } /// /// 处理输出状态码 /// /// /// /// /// public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings) { // 设置响应状态码 UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings); switch (statusCode) { // 处理 401 状态码 case StatusCodes.Status401Unauthorized: var result = new ResultInfo(ResultState.NOAUTH, "没有访问权限", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); context.Response.StatusCode = StatusCodes.Status401Unauthorized; await context.Response.WriteAsJsonAsync(result); break; // 处理 403 状态码 case StatusCodes.Status403Forbidden: result = new ResultInfo(ResultState.Forbidden, "403 Forbidden", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); await context.Response.WriteAsJsonAsync(result); 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 JsonResult jsonResult) data = jsonResult.Value; else if (context.Result is EmptyResult) data = null; else return null; return new JsonResult(data); } /// /// 验证失败返回值 /// /// /// /// public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) { var msg = "发生错误"; var validationResults = metadata.ValidationResult; if (validationResults != null && validationResults.Count() > 0) { var messages = validationResults.FirstOrDefault().Value; if (messages.Length > 0) { msg = messages[0]; } } var result = new ResultInfo(ResultState.FAIL, msg, DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); return new JsonResult(result); } } }