/// <summary> /// 设置验证失败结果 /// </summary> /// <param name="context">动作方法执行上下文</param> /// <param name="modelState">模型验证状态</param> /// <param name="actionDescriptor"></param> private static void SetValidateFailedResult(ActionExecutingContext context, ModelStateDictionary modelState, ControllerActionDescriptor actionDescriptor) { // 将验证错误信息转换成字典并序列化成 Json var validationResults = modelState.ToDictionary(u => !JsonSerializerUtility.EnabledPascalPropertyNaming ? u.Key.ToTitlePascal() : u.Key , u => modelState[u.Key].Errors.Select(c => c.ErrorMessage)); var validateFaildMessage = JsonSerializerUtility.Serialize(validationResults); // 判断是否跳过规范化结果 if (UnifyResultContext.IsSkipUnifyHandler(actionDescriptor.MethodInfo, out var unifyResult)) { // 返回 400 错误 var result = new BadRequestObjectResult(modelState); // 设置返回的响应类型 result.ContentTypes.Add(MediaTypeNames.Application.Json); result.ContentTypes.Add(MediaTypeNames.Application.Xml); context.Result = result; } else { context.Result = unifyResult.OnValidateFailed(context, modelState, validationResults, validateFaildMessage); } // 打印验证失败信息 App.PrintToMiniProfiler(MiniProfilerCategory, "Failed", $"Validation Failed:\r\n{validateFaildMessage}", true); }
/// <summary> /// 成功返回值 /// </summary> /// <param name="context"></param> /// <returns></returns> public IActionResult OnSuccessed(ActionExecutedContext context) { object data; // 处理内容结果 if (context.Result is ContentResult contentResult) { data = contentResult.Content; } // 处理对象结果 else if (context.Result is ObjectResult objectResult) { data = objectResult.Value; } else { return(null); } return(new JsonResult(new RESTfulResult <object> { StatusCode = context.Result is EmptyResult ? StatusCodes.Status204NoContent : StatusCodes.Status200OK, // 处理没有返回值情况 204 Successed = true, Data = data, Errors = null, Extras = UnifyResultContext.Take() })); }
/// <summary> /// 处理输出状态码 /// </summary> /// <param name="context"></param> /// <param name="statusCode"></param> /// <returns></returns> public async Task OnResponseStatusCodes(HttpContext context, int statusCode) { switch (statusCode) { // 处理 401 状态码 case StatusCodes.Status401Unauthorized: await context.Response.WriteAsJsonAsync(new RESTfulResult <object> { StatusCode = StatusCodes.Status401Unauthorized, Successed = false, Data = null, Errors = "401 Unauthorized", Extras = UnifyResultContext.Take() }); break; // 处理 403 状态码 case StatusCodes.Status403Forbidden: await context.Response.WriteAsJsonAsync(new RESTfulResult <object> { StatusCode = StatusCodes.Status403Forbidden, Successed = false, Data = null, Errors = "403 Forbidden", Extras = UnifyResultContext.Take() }); break; default: break; } }
/// <summary> /// 设置验证失败结果 /// </summary> /// <param name="context">动作方法执行上下文</param> /// <param name="modelState">模型验证状态</param> /// <param name="actionDescriptor"></param> private static void SetValidateFailedResult(ActionExecutingContext context, ModelStateDictionary modelState, ControllerActionDescriptor actionDescriptor) { // 将验证错误信息转换成字典并序列化成 Json var validationResults = modelState.ToDictionary(u => u.Key, u => modelState[u.Key].Errors.Select(c => c.ErrorMessage)); var validateFaildMessage = JsonSerializer.Serialize(validationResults, new JsonSerializerOptions { PropertyNameCaseInsensitive = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); // 判断是否跳过规范化结果 if (UnifyResultContext.IsSkipUnifyHandler(actionDescriptor.MethodInfo, out var unifyResult)) { // 返回 400 错误 var result = new BadRequestObjectResult(modelState); // 设置返回的响应类型 result.ContentTypes.Add(MediaTypeNames.Application.Json); result.ContentTypes.Add(MediaTypeNames.Application.Xml); context.Result = result; } else { context.Result = unifyResult.OnValidateFailed(context, modelState, validationResults, validateFaildMessage); } // 打印验证失败信息 App.PrintToMiniProfiler(MiniProfilerCategory, "Failed", $"Validation Failed:\r\n{validateFaildMessage}", true); }
/// <summary> /// 验证失败返回值 /// </summary> /// <param name="context"></param> /// <param name="modelStates"></param> /// <param name="validationResults"></param> /// <param name="validateFaildMessage"></param> /// <returns></returns> public IActionResult OnValidateFailed(ActionExecutingContext context, ModelStateDictionary modelStates, Dictionary <string, IEnumerable <string> > validationResults, string validateFaildMessage) { return(new JsonResult(new RESTfulResult <object> { StatusCode = StatusCodes.Status400BadRequest, Successed = false, Data = null, Errors = validationResults, Extras = UnifyResultContext.Take() })); }
/// <summary> /// 异常返回值 /// </summary> /// <param name="context"></param> /// <returns></returns> public IActionResult OnException(ExceptionContext context) { // 解析异常信息 var(ErrorCode, ErrorObject) = UnifyResultContext.GetExceptionMetadata(context); return(new JsonResult(new RESTfulResult <object> { StatusCode = ErrorCode, Successed = false, Data = null, Errors = ErrorObject })); }
/// <summary> /// 设置异常状态码 /// </summary> /// <param name="exception"></param> /// <param name="statusCode"></param> /// <returns></returns> public static Exception StatusCode(this Exception exception, int statusCode = StatusCodes.Status500InternalServerError) { UnifyResultContext.Set(UnifyResultContext.UnifyResultStatusCodeKey, statusCode); return(exception); }