如何基于API方法配置Swashbuckle ISchemaFilter生成不同模型Schema
实现Swashbuckle根据API方法动态过滤模型属性
这个需求完全可以实现,核心是从SchemaFilterContext中获取当前处理的API方法信息,再针对性调整Schema的属性。以下是具体实现方案:
步骤1:编写自定义SchemaFilter
public class DogSwaggerFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { // 从上下文获取关联的API操作实例 var hasOperation = context.ApiModel?.Extensions.TryGetValue( "Microsoft.AspNetCore.Mvc.ApiExplorer.ApiOperation", out var operationObj) == true; if (!hasOperation || operationObj is not Microsoft.AspNetCore.Mvc.ApiExplorer.ApiOperation apiOperation) return; // 获取当前API方法的Action名称 var methodName = apiOperation.ActionDescriptor.RouteValues["action"]; // 根据方法名过滤属性 if (methodName == "Bark") { schema.Properties.Remove("Legs"); schema.Required.Remove("Legs"); // 同步移除必填项声明 } else if (methodName == "ShowMeThoseLegs") { schema.Properties.Remove("GoodBoiBarksThisLoud"); schema.Required.Remove("GoodBoiBarksThisLoud"); } } }
步骤2:注册过滤器
在Swagger配置中保持你原来的注册方式即可:
services.AddSwaggerGen(c => { // 其他配置... c.SchemaFilter<DogSwaggerFilter>(); });
关键说明
- 获取方法信息的逻辑:通过
SchemaFilterContext.ApiModel.Extensions读取内部存储的ApiOperation实例,这个键"Microsoft.AspNetCore.Mvc.ApiExplorer.ApiOperation"是Swashbuckle内部约定的,稳定可用。 - 属性过滤:直接操作
schema.Properties集合移除不需要的属性,同时要同步更新schema.Required集合,避免Swagger UI显示错误的必填项提示。 - 扩展性:如果需要处理更多模型或方法,可以扩展这个逻辑——比如给API方法添加自定义特性(如
[SwaggerModelInclude(nameof(Dog.GoodBoiBarksThisLoud))]),在过滤器中读取特性配置来动态过滤,更灵活通用。
内容的提问来源于stack exchange,提问作者Cnt
相关产品推荐
相关产品推荐

