ASP.NET Core 5如何隐藏Action中带[BindNever]特性的Swagger参数
解决方案
针对ASP.NET Core 5环境下的需求,可通过以下两种方案实现:
方案1:自定义OperationFilter(通用无依赖)
该方案不需要在每个参数上额外加特性,全局自动处理所有带[BindNever]的参数,适配参数出现在查询、表单、请求体等所有场景,修改后的Filter代码如下:
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Linq; using System.Reflection; public class SwaggerExcludeBindNeverFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 拿到所有带BindNever特性的参数名 var excludedParams = context.MethodInfo.GetParameters() .Where(p => p.IsDefined(typeof(BindNeverAttribute), inherit: true)) .Select(p => p.Name) .ToHashSet(StringComparer.OrdinalIgnoreCase); if (!excludedParams.Any()) return; // 移除路径、查询、Header、Cookie等位置的对应参数 if (operation.Parameters != null) { operation.Parameters = operation.Parameters .Where(p => !excludedParams.Contains(p.Name)) .ToList(); } // 移除请求体(JSON/Form等)中的对应字段 if (operation.RequestBody != null) { foreach (var mediaType in operation.RequestBody.Content.Values) { if (mediaType.Schema?.Properties == null) continue; // 删属性 foreach (var paramName in excludedParams) { mediaType.Schema.Properties.Remove(paramName); } // 同步移除必填校验规则 if (mediaType.Schema.Required != null) { mediaType.Schema.Required = mediaType.Schema.Required .Where(r => !excludedParams.Contains(r)) .ToHashSet(); } } // 如果请求体所有字段都被清空,直接删除整个RequestBody if (operation.RequestBody.Content.All(c => c.Value.Schema?.Properties?.Count == 0)) { operation.RequestBody = null; } } } }
你原本的Swagger注册逻辑不需要改动,保持以下配置即可生效:
services.AddSwaggerGen(options => { // 其他Swagger配置... options.OperationFilter<SwaggerExcludeBindNeverFilter>(); });
方案2:特性组合实现(更简便,无需自定义Filter)
如果不需要全局处理,只需要针对个别参数配置,可以直接在参数上同时加两个特性,即可同时满足「阻止参数绑定」+「Swagger不展示」的需求:
[HttpGet("{id:int}")] [TryGetUserByIdValidation(GetAsUserReadDto = true, UserArgumentName = "userDto")] public virtual ActionResult<ApiResult<User>> Get(int id, [BindNever, OpenApiIgnore] UserReadDto userDto) { var res = new ApiResult<UserReadDto>() .WithData(userDto); return Ok(res); }
其中[OpenApiIgnore]是Swashbuckle.AspNetCore内置的特性,专门用于指定Swagger忽略对应的元素,不需要额外配置即可生效。
内容的提问来源于stack exchange,提问作者AmirJabari
相关产品推荐
相关产品推荐

