You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:58:05