/// <summary> /// 动作方法执行之前操作 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { // 获取控制器/方法信息 var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; // 跳过验证类型 var nonValidationAttributeType = typeof(NonValidationAttribute); var method = actionDescriptor.MethodInfo; // 如果参数为 0或贴了 [NonValidation] 特性 或所在类型贴了 [NonValidation] 特性,则跳过验证 if (actionDescriptor.Parameters.Count == 0 || method.IsDefined(nonValidationAttributeType, true) || method.DeclaringType.IsDefined(nonValidationAttributeType, true)) { return; } // 获取验证状态 var modelState = context.ModelState; // 判断是否验证成功 if (modelState.IsValid) { return; } // 如果其他过滤器已经设置了结果,那么跳过 if (context.Result != null) { return; } // 解析验证消息 var validationMetadata = ValidatorContext.GetValidationMetadata(modelState); // 判断是否跳过规范化结果,如果跳过,返回 400 BadRequestResult if (UnifyContext.CheckFailedNonUnify(actionDescriptor.MethodInfo, out var unifyResult)) { context.Result = new BadRequestResult(); } else { // 判断是否支持 MVC 规范化处理 if (!UnifyContext.CheckSupportMvcController(context.HttpContext, actionDescriptor, out _)) { return; } context.Result = unifyResult.OnValidateFailed(context, validationMetadata); } // 打印验证失败信息 App.PrintToMiniProfiler("validation", "Failed", $"Validation Failed:\r\n{validationMetadata.Message}", true); }
/// <summary> /// 异常拦截 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task OnExceptionAsync(ExceptionContext context) { // 解析异常处理服务,实现自定义异常额外操作,如记录日志等 var globalExceptionHandler = context.HttpContext.RequestServices.GetService <IGlobalExceptionHandler>(); if (globalExceptionHandler != null) { await globalExceptionHandler.OnExceptionAsync(context); } // 如果异常在其他地方被标记了处理,那么这里不再处理 if (context.ExceptionHandled) { return; } // 获取控制器信息 var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; // 解析异常信息 var exceptionMetadata = UnifyContext.GetExceptionMetadata(context); // 判断是否是验证异常 var isValidationException = context.Exception is AppFriendlyException friendlyException && friendlyException.ValidationException; // 判断是否跳过规范化结果,如果是,则只处理为友好异常消息 if (UnifyContext.CheckFailedNonUnify(actionDescriptor.MethodInfo, out var unifyResult)) { // 如果是验证异常,返回 400 if (isValidationException) { context.Result = new BadRequestResult(); } else { // 返回友好异常 context.Result = new ContentResult() { Content = exceptionMetadata.Errors.ToString(), StatusCode = exceptionMetadata.StatusCode }; } } else { // 判断是否支持 MVC 规范化处理 if (!UnifyContext.CheckSupportMvcController(context.HttpContext, actionDescriptor, out _)) { return; } // 执行规范化异常处理 context.Result = unifyResult.OnException(context, exceptionMetadata); } // 判断异常消息是否是验证异常(比如数据验证异常,业务抛出异常) if (isValidationException) { // 解析验证消息 var validationMetadata = ValidatorContext.GetValidationMetadata((context.Exception as AppFriendlyException).ErrorMessage); App.PrintToMiniProfiler("Validation", "Failed", $"Validation Failed:\r\n{validationMetadata.Message}", true); } else { PrintToMiniProfiler(context.Exception); } }