using DocumentServiceAPI.Model; using Furion; using Furion.DataValidation; using Furion.FriendlyException; using Furion.UnifyResult; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Threading.Tasks; namespace DocumentServiceAPI.Web.Core { /// /// 统一返回 /// [UnifyModel(typeof(DSFulResult<>))] public class DSRESTFulResultProvider : IUnifyResultProvider { /// /// 异常返回值 /// /// /// /// public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) { return new JsonResult(DsFulResult(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(DsFulResult(StatusCodes.Status200OK, 1, data) , UnifyContext.GetSerializerSettings(context)); // 当前行仅限 Furion 4.6.6+ 使用 } /// /// 验证失败返回值 /// /// /// /// public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) { //设置返回状态码 return new JsonResult(DsFulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, Code: 0, data: metadata.Data, errors: metadata.ValidationResult) , UnifyContext.GetSerializerSettings(context)); // 当前行仅限 Furion 4.6.6+ 使用 } /// /// 特定状态码返回值 /// /// /// /// /// public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings) { // 设置响应状态码 UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings); switch (statusCode) { // 处理 401 状态码 case StatusCodes.Status401Unauthorized: await context.Response.WriteAsJsonAsync(DsFulResult(statusCode,Code:0, errors: "401 Unauthorized") , App.GetOptions()?.JsonSerializerOptions); break; // 处理 403 状态码 case StatusCodes.Status403Forbidden: await context.Response.WriteAsJsonAsync(DsFulResult(statusCode, Code: 0, errors: "403 Forbidden") , App.GetOptions()?.JsonSerializerOptions); break; default: break; } } /// /// 返回 RESTful 风格结果集 /// /// /// 成功状态码 /// /// /// private static DSFulResult DsFulResult(int statusCode, int Code = 1, object data = default, object errors = default) { return new DSFulResult { Code = Code, StatusCode= statusCode, Data = data, Error = errors, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }; } } }