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.Linq; using System.Text; using System.Threading.Tasks; namespace Waste.Web.Core { /// /// RESTFUL 风格返回值 /// [SkipScan, UnifyModel(typeof(RESTfulResult<>))] public class RESTfulResultProvider : IUnifyResultProvider { /// /// 异常返回值 /// /// /// public IActionResult OnException(ExceptionContext context) { //解析异常信息 var (StatusCode, ErrorCode, Errors) = UnifyContext.GetExceptionMetadata(context); return new JsonResult(new RESTfulResult { StatusCode = StatusCode, Succeeded = false, Data = null, Errors = Errors, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); } /// /// 处理输出状态码 /// /// /// /// /// public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultStatusCodesOptions options = null) { switch (statusCode) { // 处理 401 状态码 case StatusCodes.Status401Unauthorized: await context.Response.WriteAsJsonAsync(new RESTfulResult { StatusCode = StatusCodes.Status401Unauthorized, Succeeded = false, Data = null, Errors = "401 Unauthorized", Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); break; // 处理 403 状态码 case StatusCodes.Status403Forbidden: await context.Response.WriteAsJsonAsync(new RESTfulResult { StatusCode = StatusCodes.Status403Forbidden, Succeeded = false, Data = null, Errors = "403 Forbidden", 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 new JsonResult(new RESTfulResult { StatusCode = context.Result is EmptyResult ? StatusCodes.Status204NoContent : StatusCodes.Status200OK, // 处理没有返回值情况 204 Succeeded = true, Data = data, Errors = null, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); } /// /// 验证失败返回值 /// /// /// /// /// /// public IActionResult OnValidateFailed(ActionExecutingContext context, ModelStateDictionary modelStates, IEnumerable validationResults, string validateFailedMessage) { return new JsonResult(new RESTfulResult { StatusCode = StatusCodes.Status400BadRequest, Succeeded = false, Data = null, Errors = validationResults, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); } } }