using Furion.DataValidation; using Furion.DependencyInjection; using Furion.FriendlyException; using Furion.UnifyResult; //using Furion.UnifyResult.Internal; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System.Net; using Yw.Untity; namespace Yw.WebApi { /// /// 规范化RESTful风格返回值 /// [SuppressSniffer, UnifyModel(typeof(XnRestfulResult<>))] public class XnRestfulResultProvider : IUnifyResultProvider { /// /// 异常 /// public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) { // 解析异常信息 var exceptionMetadata = UnifyContext.GetExceptionMetadata(context); return new JsonResult(new XnRestfulResult { Code = XnRestfulResultCode.Error, Message = exceptionMetadata.Errors, Data = exceptionMetadata.StatusCode, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }); } /// /// 成功 /// public IActionResult OnSucceeded(ActionExecutedContext context, object data) { switch (context.Result) { // 处理内容结果 case ContentResult contentResult: data = contentResult.Content; break; // 处理对象结果 case ObjectResult objectResult: data = objectResult.Value; break; case EmptyResult: data = null; break; default: return null; } return new JsonResult(new XnRestfulResult { Code = XnRestfulResultCode.Success, Message = "请求成功", Data = data, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }); } /// /// 验证失败 /// public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) { return new JsonResult(new XnRestfulResult { Code = XnRestfulResultCode.Prompt, Message = metadata.ValidationResult, Data = null, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }); } /// /// 响应状态码 /// public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = null) { // 设置响应状态码 UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings); if (Enum.IsDefined(typeof(HttpStatusCode), (HttpStatusCode)statusCode)) { await context.Response.WriteAsJsonAsync(new XnRestfulResult { Code = XnRestfulResultCode.Alert, Message = EnumUtil.GetDescription((HttpStatusCode)statusCode), Data = statusCode, Extras = UnifyContext.Take(), Timestamp = DateTime.Now }); } } } }