From b200a7836dbd6f1761d2dd0a954b34c135e968cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E5=B0=8F=E5=83=A7?= Date: Sat, 7 Nov 2020 13:56:52 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=BE=20break=20changes=20and=20close=20?= =?UTF-8?q?#I24B8P.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Fur.Application/Persons/PersonService.cs | 1 + framework/Fur.Application/RBAC/RBACService.cs | 1 + .../AppApplicationBuilderExtensions.cs | 12 +- .../AppServiceCollectionExtensions.cs | 16 +- .../Attributes/DataValidationAttribute.cs | 6 +- .../Attributes/NonValidationAttribute.cs | 2 +- .../DataValidation/Enums/ValidationPattern.cs | 2 +- .../Filters/DataValidationFilter.cs | 16 +- .../Validators/DataValidator.cs | 1 + .../ApiDescriptionSettingsAttribute.cs | 4 +- .../Attributes/ApiSeatAttribute.cs | 2 +- ...ApiControllerApplicationModelConvention.cs | 7 +- .../DynamicApiController/Enums/ApiSeats.cs | 2 +- .../Filters/FriendlyExceptionFilter.cs | 13 +- framework/Fur/Fur.csproj | 2 +- framework/Fur/Fur.xml | 412 ++++++++++-------- .../Attributes/NonUnifyAttribute.cs | 13 + .../Attributes/UnifyResultAttribute.cs | 2 +- .../Filters/SuccessUnifyResultFilter.cs | 4 +- .../UnifyResultStatusCodesMiddleware.cs | 4 +- .../Fur/UnifyResult/UnifyResultContext.cs | 50 +++ 21 files changed, 348 insertions(+), 224 deletions(-) create mode 100644 framework/Fur/UnifyResult/Attributes/NonUnifyAttribute.cs diff --git a/framework/Fur.Application/Persons/PersonService.cs b/framework/Fur.Application/Persons/PersonService.cs index 57fbbeb33d6..e842233d347 100644 --- a/framework/Fur.Application/Persons/PersonService.cs +++ b/framework/Fur.Application/Persons/PersonService.cs @@ -87,6 +87,7 @@ public async Task Find(int id) /// 查询所有 /// /// + //[NonUnify] public async Task> GetAll() { var persons = _personRepository.AsQueryable(false) diff --git a/framework/Fur.Application/RBAC/RBACService.cs b/framework/Fur.Application/RBAC/RBACService.cs index d99154f67b5..96e2ea0dcf4 100644 --- a/framework/Fur.Application/RBAC/RBACService.cs +++ b/framework/Fur.Application/RBAC/RBACService.cs @@ -7,6 +7,7 @@ using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; diff --git a/framework/Fur/App/Extensions/AppApplicationBuilderExtensions.cs b/framework/Fur/App/Extensions/AppApplicationBuilderExtensions.cs index 9ea93ac727b..bab3e3c7efe 100644 --- a/framework/Fur/App/Extensions/AppApplicationBuilderExtensions.cs +++ b/framework/Fur/App/Extensions/AppApplicationBuilderExtensions.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Builder public static class AppApplicationBuilderExtensions { /// - /// 注入基础中间件 + /// 注入基础中间件(带Swagger) /// /// /// @@ -22,6 +22,16 @@ public static IApplicationBuilder UseInject(this IApplicationBuilder app, string return app; } + /// + /// 注入基础中间件 + /// + /// + /// + public static IApplicationBuilder UseInjectBase(this IApplicationBuilder app) + { + return app; + } + /// /// 添加应用中间件 /// diff --git a/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs b/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs index d1874da288d..88fcd868d4c 100644 --- a/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs +++ b/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs @@ -19,7 +19,7 @@ public static class AppServiceCollectionExtensions private const string MiniProfilerRouteBasePath = "/index-mini-profiler"; /// - /// Mvc 注入基础配置 + /// Mvc 注入基础配置(带Swagger) /// /// Mvc构建起 /// IMvcBuilder @@ -36,6 +36,20 @@ public static IMvcBuilder AddInject(this IMvcBuilder mvcBuilder) return mvcBuilder; } + /// + /// Mvc 注入基础配置 + /// + /// Mvc构建起 + /// IMvcBuilder + public static IMvcBuilder AddInjectBase(this IMvcBuilder mvcBuilder) + { + mvcBuilder.AddDynamicApiControllers() + .AddDataValidation() + .AddFriendlyException(); + + return mvcBuilder; + } + /// /// Mvc 注入基础配置和规范化结果 /// diff --git a/framework/Fur/DataValidation/Attributes/DataValidationAttribute.cs b/framework/Fur/DataValidation/Attributes/DataValidationAttribute.cs index ff49043ec41..b2631f67510 100644 --- a/framework/Fur/DataValidation/Attributes/DataValidationAttribute.cs +++ b/framework/Fur/DataValidation/Attributes/DataValidationAttribute.cs @@ -1,8 +1,8 @@ -using Fur.DependencyInjection; -using System.ComponentModel.DataAnnotations; +using Fur.DataValidation; +using Fur.DependencyInjection; using System.Linq; -namespace Fur.DataValidation +namespace System.ComponentModel.DataAnnotations { /// /// 数据类型验证特性 diff --git a/framework/Fur/DataValidation/Attributes/NonValidationAttribute.cs b/framework/Fur/DataValidation/Attributes/NonValidationAttribute.cs index 48946ae9bf1..fabca45411f 100644 --- a/framework/Fur/DataValidation/Attributes/NonValidationAttribute.cs +++ b/framework/Fur/DataValidation/Attributes/NonValidationAttribute.cs @@ -1,7 +1,7 @@ using Fur.DependencyInjection; using System; -namespace Fur.DataValidation +namespace Microsoft.AspNetCore.Mvc { /// /// 跳过验证 diff --git a/framework/Fur/DataValidation/Enums/ValidationPattern.cs b/framework/Fur/DataValidation/Enums/ValidationPattern.cs index 9c1c4499c9b..7c1d60c2ed3 100644 --- a/framework/Fur/DataValidation/Enums/ValidationPattern.cs +++ b/framework/Fur/DataValidation/Enums/ValidationPattern.cs @@ -1,6 +1,6 @@ using Fur.DependencyInjection; -namespace Fur.DataValidation +namespace System.ComponentModel.DataAnnotations { /// /// 验证逻辑 diff --git a/framework/Fur/DataValidation/Filters/DataValidationFilter.cs b/framework/Fur/DataValidation/Filters/DataValidationFilter.cs index e2f3ac9b185..b758e494b85 100644 --- a/framework/Fur/DataValidation/Filters/DataValidationFilter.cs +++ b/framework/Fur/DataValidation/Filters/DataValidationFilter.cs @@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.ModelBinding; -using Microsoft.Extensions.DependencyInjection; using System; using System.Linq; using System.Net.Mime; @@ -91,7 +90,7 @@ public void OnActionExecuting(ActionExecutingContext context) if (context.Result == null && !modelState.IsValid) { // 设置验证失败结果 - SetValidateFailedResult(context, modelState); + SetValidateFailedResult(context, modelState, actionDescriptor); } } @@ -100,7 +99,8 @@ public void OnActionExecuting(ActionExecutingContext context) /// /// 动作方法执行上下文 /// 模型验证状态 - private void SetValidateFailedResult(ActionExecutingContext context, ModelStateDictionary modelState) + /// + private 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)); @@ -110,13 +110,8 @@ private void SetValidateFailedResult(ActionExecutingContext context, ModelStateD WriteIndented = true }); - // 处理规范化结果 - var unifyResult = _serviceProvider.GetService(); - if (unifyResult != null) - { - context.Result = unifyResult.OnValidateFailed(context, modelState, validationResults, validateFaildMessage); - } - else + // 判断是否跳过规范化结果 + if (UnifyResultContext.IsSkipUnifyHandler(actionDescriptor.MethodInfo, out var unifyResult)) { // 返回 400 错误 var result = new BadRequestObjectResult(modelState); @@ -127,6 +122,7 @@ private void SetValidateFailedResult(ActionExecutingContext context, ModelStateD context.Result = result; } + else context.Result = unifyResult.OnValidateFailed(context, modelState, validationResults, validateFaildMessage); // 打印验证失败信息 App.PrintToMiniProfiler(MiniProfilerCategory, "Failed", $"Validation Failed:\r\n{validateFaildMessage}", true); diff --git a/framework/Fur/DataValidation/Validators/DataValidator.cs b/framework/Fur/DataValidation/Validators/DataValidator.cs index c650e84497c..494ec693d2b 100644 --- a/framework/Fur/DataValidation/Validators/DataValidator.cs +++ b/framework/Fur/DataValidation/Validators/DataValidator.cs @@ -1,4 +1,5 @@ using Fur.DependencyInjection; +using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Concurrent; using System.Collections.Generic; diff --git a/framework/Fur/DynamicApiController/Attributes/ApiDescriptionSettingsAttribute.cs b/framework/Fur/DynamicApiController/Attributes/ApiDescriptionSettingsAttribute.cs index 2ef91c56dc1..52dfecc67f3 100644 --- a/framework/Fur/DynamicApiController/Attributes/ApiDescriptionSettingsAttribute.cs +++ b/framework/Fur/DynamicApiController/Attributes/ApiDescriptionSettingsAttribute.cs @@ -1,8 +1,8 @@ using Fur.DependencyInjection; -using Microsoft.AspNetCore.Mvc; +using Fur.DynamicApiController; using System; -namespace Fur.DynamicApiController +namespace Microsoft.AspNetCore.Mvc { /// /// 接口描述设置 diff --git a/framework/Fur/DynamicApiController/Attributes/ApiSeatAttribute.cs b/framework/Fur/DynamicApiController/Attributes/ApiSeatAttribute.cs index df65b18c76d..9a4d41347ed 100644 --- a/framework/Fur/DynamicApiController/Attributes/ApiSeatAttribute.cs +++ b/framework/Fur/DynamicApiController/Attributes/ApiSeatAttribute.cs @@ -1,7 +1,7 @@ using Fur.DependencyInjection; using System; -namespace Fur.DynamicApiController +namespace Microsoft.AspNetCore.Mvc { /// /// 接口参数位置设置 diff --git a/framework/Fur/DynamicApiController/Conventions/DynamicApiControllerApplicationModelConvention.cs b/framework/Fur/DynamicApiController/Conventions/DynamicApiControllerApplicationModelConvention.cs index 3d7d8c13551..6786a4d91ab 100644 --- a/framework/Fur/DynamicApiController/Conventions/DynamicApiControllerApplicationModelConvention.cs +++ b/framework/Fur/DynamicApiController/Conventions/DynamicApiControllerApplicationModelConvention.cs @@ -3,9 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ActionConstraints; -using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.ApplicationModels; -using Microsoft.AspNetCore.Mvc.Core; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.Routing; using System; @@ -488,9 +486,8 @@ private static bool CheckIsSplitCamelCase(ApiDescriptionSettingsAttribute apiDes /// private static void ConfigureActionUnifyResultAttribute(ActionModel action) { - // 判断是否手动添加了标注 - if (action.Attributes.Any(x => typeof(ProducesResponseTypeAttribute).IsAssignableFrom(x.GetType()) - || typeof(IApiResponseMetadataProvider).IsAssignableFrom(x.GetType()))) return; + // 判断是否手动添加了标注或跳过规范化处理 + if (UnifyResultContext.IsSkipOnSuccessUnifyHandler(action.ActionMethod, out var _)) return; // 获取真实类型 var returnType = action.ActionMethod.GetMethodRealReturnType(); diff --git a/framework/Fur/DynamicApiController/Enums/ApiSeats.cs b/framework/Fur/DynamicApiController/Enums/ApiSeats.cs index ab8c3e69e7c..a1fc65a3b21 100644 --- a/framework/Fur/DynamicApiController/Enums/ApiSeats.cs +++ b/framework/Fur/DynamicApiController/Enums/ApiSeats.cs @@ -1,6 +1,6 @@ using Fur.DependencyInjection; -namespace Fur.DynamicApiController +namespace Microsoft.AspNetCore.Mvc { /// /// 接口参数位置 diff --git a/framework/Fur/FriendlyException/Filters/FriendlyExceptionFilter.cs b/framework/Fur/FriendlyException/Filters/FriendlyExceptionFilter.cs index da7104ad71f..52593d13956 100644 --- a/framework/Fur/FriendlyException/Filters/FriendlyExceptionFilter.cs +++ b/framework/Fur/FriendlyException/Filters/FriendlyExceptionFilter.cs @@ -58,15 +58,16 @@ public async Task OnExceptionAsync(ExceptionContext context) var validationFlag = "[Validation]"; var errorMessage = exception.Message.StartsWith(validationFlag) ? exception.Message[validationFlag.Length..] : exception.Message; - // 处理规范化结果 - var unifyResult = _serviceProvider.GetService(); - context.Result = unifyResult == null - ? new ContentResult + // 判断是否跳过规范化结果 + if (UnifyResultContext.IsSkipUnifyHandler(actionDescriptor.MethodInfo, out var unifyResult)) + { + context.Result = new ContentResult { Content = errorMessage, StatusCode = exception.Message.StartsWith(validationFlag) ? StatusCodes.Status400BadRequest : StatusCodes.Status500InternalServerError - } - : unifyResult.OnException(context); + }; + } + else context.Result = unifyResult.OnException(context); // 处理验证异常,打印验证失败信息 if (exception.Message.StartsWith(validationFlag)) diff --git a/framework/Fur/Fur.csproj b/framework/Fur/Fur.csproj index f34b6814e24..d741b4c81ff 100644 --- a/framework/Fur/Fur.csproj +++ b/framework/Fur/Fur.csproj @@ -10,7 +10,7 @@ https://gitee.com/monksoul/Fur Gitee Apache-2.0 - 1.0.0-rc.final.87 + 1.0.0-rc.final.91 true icon.png diff --git a/framework/Fur/Fur.xml b/framework/Fur/Fur.xml index dc11ab9d872..0917e18b793 100644 --- a/framework/Fur/Fur.xml +++ b/framework/Fur/Fur.xml @@ -18834,47 +18834,6 @@ 加密文本 - - - 数据类型验证特性 - - - - - 构造函数 - - 验证逻辑 - - - - - 构造函数 - - - - - - 验证逻辑 - - - - - - - - 验证类型 - - - - - 验证逻辑 - - - - - 跳过验证 - - 验证项元数据 @@ -18929,21 +18888,6 @@ 验证类型特性 - - - 验证逻辑 - - - - - 全部都要验证通过 - - - - - 至少一个验证通过 - - 验证类型 @@ -19138,7 +19082,7 @@ 验证类型 - + 拓展方法,验证单个值 @@ -19168,7 +19112,7 @@ 单个值 验证类型 - + 拓展方法,验证单个值 @@ -19233,12 +19177,13 @@ - + 设置验证失败结果 动作方法执行上下文 模型验证状态 + @@ -19344,7 +19289,7 @@ - + 验证类型验证 @@ -19587,89 +19532,6 @@ - - - 接口描述设置 - - - - - 构造函数 - - - - - 构造函数 - - 是否启用 - - - - 构造函数 - - 分组列表 - - - - 自定义名称 - - - - - 保留原有名称 - - - - - 切割骆驼命名 - - - - - 保留路由谓词 - - - - - 是否启用 - - - - - 模块名 - - - - - 版本号 - - - - - 分组 - - - - - 标签 - - - - - 接口参数位置设置 - - - - - 构造函数 - - - - - - 参数位置 - - 动态 WebApi特性接口 @@ -19706,21 +19568,21 @@ 引用模型 - + 配置控制器 控制器模型 接口描述配置 - + 配置控制器名称 控制器模型 接口描述配置 - + 配置动作方法 @@ -19734,7 +19596,7 @@ 动作方法模型 - + 配置动作方法名称 @@ -19754,7 +19616,7 @@ - + 配置动作方法路由特性 @@ -19762,7 +19624,7 @@ 接口描述配置 控制器接口描述配置 - + 生成控制器路由模板 @@ -19777,7 +19639,7 @@ 动作方法模型 - + 配置控制器和动作方法名称 @@ -19788,7 +19650,7 @@ - + 检查是否设置了 KeepName参数 @@ -19796,7 +19658,7 @@ - + 检查是否设置了 KeepVerb 参数 @@ -19804,7 +19666,7 @@ - + 判断切割命名参数是否配置 @@ -19830,31 +19692,6 @@ 动态接口控制器依赖接口 - - - 接口参数位置 - - - - - 控制器之前 - - - - - 控制器之后 - - - - - 行为之前 - - - - - 行为之后 - - 参数路由模板 @@ -21222,6 +21059,30 @@ 读取附加信息 + + + 是否跳过成功结果规范处理 + + + + + + + + 是否跳过规范化处理 + + + + + + + + 是否跳过规范化处理 + + + + + 视图编译构建器 @@ -21970,12 +21831,19 @@ - 注入基础中间件 + 注入基础中间件(带Swagger) + + + 注入基础中间件 + + + + 添加应用中间件 @@ -22080,6 +21948,119 @@ + + + 跳过验证 + + + + + 接口描述设置 + + + + + 构造函数 + + + + + 构造函数 + + 是否启用 + + + + 构造函数 + + 分组列表 + + + + 自定义名称 + + + + + 保留原有名称 + + + + + 切割骆驼命名 + + + + + 保留路由谓词 + + + + + 是否启用 + + + + + 模块名 + + + + + 版本号 + + + + + 分组 + + + + + 标签 + + + + + 接口参数位置设置 + + + + + 构造函数 + + + + + + 参数位置 + + + + + 接口参数位置 + + + + + 控制器之前 + + + + + 控制器之后 + + + + + 行为之前 + + + + + 行为之后 + + 友好异常拦截器 @@ -22103,31 +22084,36 @@ - + + + 禁止规范化处理 + + + 规范化结果配置 - + 构造函数 - + 构造函数 - + 构造函数 - + 包装类型 @@ -22144,6 +22130,13 @@ + + Mvc 注入基础配置(带Swagger) + + Mvc构建起 + IMvcBuilder + + Mvc 注入基础配置 @@ -22916,6 +22909,57 @@ 新的集合对象表达式 + + + 数据类型验证特性 + + + + + 构造函数 + + 验证逻辑 + + + + + 构造函数 + + + + + + 验证逻辑 + + + + + + + + 验证类型 + + + + + 验证逻辑 + + + + + 验证逻辑 + + + + + 全部都要验证通过 + + + + + 至少一个验证通过 + + System.Linq 拓展 diff --git a/framework/Fur/UnifyResult/Attributes/NonUnifyAttribute.cs b/framework/Fur/UnifyResult/Attributes/NonUnifyAttribute.cs new file mode 100644 index 00000000000..45384400a8a --- /dev/null +++ b/framework/Fur/UnifyResult/Attributes/NonUnifyAttribute.cs @@ -0,0 +1,13 @@ +using Fur.DependencyInjection; +using System; + +namespace Microsoft.AspNetCore.Mvc +{ + /// + /// 禁止规范化处理 + /// + [SkipScan, AttributeUsage(AttributeTargets.Method)] + public sealed class NonUnifyAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/framework/Fur/UnifyResult/Attributes/UnifyResultAttribute.cs b/framework/Fur/UnifyResult/Attributes/UnifyResultAttribute.cs index df088e4af0c..06f87201878 100644 --- a/framework/Fur/UnifyResult/Attributes/UnifyResultAttribute.cs +++ b/framework/Fur/UnifyResult/Attributes/UnifyResultAttribute.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Http; using System; -namespace Microsoft.AspNetCore.Mvc.Core +namespace Microsoft.AspNetCore.Mvc { /// /// 规范化结果配置 diff --git a/framework/Fur/UnifyResult/Filters/SuccessUnifyResultFilter.cs b/framework/Fur/UnifyResult/Filters/SuccessUnifyResultFilter.cs index 69112821a3d..6443022b2db 100644 --- a/framework/Fur/UnifyResult/Filters/SuccessUnifyResultFilter.cs +++ b/framework/Fur/UnifyResult/Filters/SuccessUnifyResultFilter.cs @@ -2,7 +2,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.Extensions.DependencyInjection; using System; using System.Threading.Tasks; @@ -57,10 +56,9 @@ public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionE var actionExecutedContext = await next(); // 如果没有异常再执行 - if (actionExecutedContext.Exception == null) + if (actionExecutedContext.Exception == null && !UnifyResultContext.IsSkipOnSuccessUnifyHandler(actionDescriptor.MethodInfo, out var unifyResult)) { // 处理规范化结果 - var unifyResult = _serviceProvider.GetService(); if (unifyResult != null && context.Result == null) { var result = unifyResult.OnSuccessed(actionExecutedContext); diff --git a/framework/Fur/UnifyResult/Middlewares/UnifyResultStatusCodesMiddleware.cs b/framework/Fur/UnifyResult/Middlewares/UnifyResultStatusCodesMiddleware.cs index 5d859a7fcf1..d16a903a327 100644 --- a/framework/Fur/UnifyResult/Middlewares/UnifyResultStatusCodesMiddleware.cs +++ b/framework/Fur/UnifyResult/Middlewares/UnifyResultStatusCodesMiddleware.cs @@ -1,6 +1,5 @@ using Fur.DependencyInjection; using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; using System; using System.Threading.Tasks; @@ -44,8 +43,7 @@ public async Task InvokeAsync(HttpContext context) await _next(context); // 处理规范化结果 - var unifyResult = _serviceProvider.GetService(); - if (unifyResult != null) + if (!UnifyResultContext.IsSkipUnifyHandler(context, out var unifyResult)) { await unifyResult.OnResponseStatusCodes(context, context.Response.StatusCode); } diff --git a/framework/Fur/UnifyResult/UnifyResultContext.cs b/framework/Fur/UnifyResult/UnifyResultContext.cs index ef234c7cdbd..4c910a74407 100644 --- a/framework/Fur/UnifyResult/UnifyResultContext.cs +++ b/framework/Fur/UnifyResult/UnifyResultContext.cs @@ -1,8 +1,12 @@ using Fur.DependencyInjection; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.DependencyInjection; using System; +using System.Linq; +using System.Reflection; using System.Text.Json; namespace Fur.UnifyResult @@ -68,5 +72,51 @@ public static object Take() App.ApplicationServices.GetService()?.HttpContext?.Items?.TryGetValue(UnifyResultExtrasKey, out extras); return extras; } + + /// + /// 是否跳过成功结果规范处理 + /// + /// + /// + /// + internal static bool IsSkipOnSuccessUnifyHandler(MethodInfo method, out IUnifyResultProvider unifyResult) + { + // 判断是否手动添加了标注或跳过规范化处理 + var isSkip = method.CustomAttributes.Any(x => typeof(NonUnifyAttribute).IsAssignableFrom(x.AttributeType) || typeof(ProducesResponseTypeAttribute).IsAssignableFrom(x.AttributeType) + || typeof(IApiResponseMetadataProvider).IsAssignableFrom(x.AttributeType)); + + unifyResult = isSkip ? null : App.GetService(); + return unifyResult == null || isSkip; + } + + /// + /// 是否跳过规范化处理 + /// + /// + /// + /// + internal static bool IsSkipUnifyHandler(MethodInfo method, out IUnifyResultProvider unifyResult) + { + // 判断是否跳过规范化处理 + var isSkip = method.CustomAttributes.Any(x => typeof(NonUnifyAttribute).IsAssignableFrom(x.AttributeType)); + + unifyResult = isSkip ? null : App.GetService(); + return unifyResult == null || isSkip; + } + + /// + /// 是否跳过规范化处理 + /// + /// + /// + /// + internal static bool IsSkipUnifyHandler(HttpContext context, out IUnifyResultProvider unifyResult) + { + // 判断是否跳过规范化处理 + var isSkip = context.GetMetadata() != null; + + unifyResult = isSkip ? null : App.GetService(); + return unifyResult == null || isSkip; + } } } \ No newline at end of file