using Furion.DataValidation; using Furion.DependencyInjection; using Furion.UnifyResult; using Furion.UnifyResult.Internal; 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 风格返回值 /// [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 EmptyResult) data = null; else data= null; return new JsonResult(new RESTfulResult { StatusCode = StatusCode, Succeeded = false, Data = data, Errors = Errors, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); } /// /// 处理输出状态码 /// /// /// /// /// 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(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, 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]; } } return new JsonResult(new RESTfulResult { StatusCode = StatusCodes.Status400BadRequest, Succeeded = false, Data = null, Errors = msg, Extras = UnifyContext.Take(), Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); } } }