如何为Swagger UI设置从appsettings.json读取的动态默认值?
给Swagger UI参数设置来自appsettings.json的默认值
1. 准备配置项
先在appsettings.json(或对应环境的配置文件)里添加要用作默认值的配置项,示例:
{ "SwaggerDefaults": { "SomethingDefault": "dev_env_default_value" } }
2. 编写自定义Swagger操作过滤器
借助Swashbuckle.AspNetCore的IOperationFilter,动态修改Swagger文档中的参数默认值,代码如下:
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; public class ConfigDefaultValueFilter : IOperationFilter { private readonly IConfiguration _config; public ConfigDefaultValueFilter(IConfiguration config) { _config = config; } public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 定位到目标参数something var targetParam = operation.Parameters?.FirstOrDefault(p => p.Name.Equals("something", StringComparison.OrdinalIgnoreCase)); if (targetParam != null) { // 从配置文件读取默认值 var defaultValue = _config["SwaggerDefaults:SomethingDefault"]; if (!string.IsNullOrWhiteSpace(defaultValue)) { targetParam.Schema.Default = new OpenApiString(defaultValue); } } } }
3. 注册过滤器并配置端点
在Program.cs中把自定义过滤器注册到Swagger服务,同时给目标端点加上WithOpenApi()(最小API默认不生成Swagger文档,必须加此方法才能让过滤器找到对应参数):
var builder = WebApplication.CreateBuilder(args); // 添加Swagger相关服务 builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.OperationFilter<ConfigDefaultValueFilter>(); }); var app = builder.Build(); // 启用Swagger和Swagger UI if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } // 配置你的Post端点,必须包含WithOpenApi() app.MapPost("/route", async (string something) => await Task.Delay(0)) .WithOpenApi(); app.Run();
关键说明
- 不同环境的配置会自动生效,比如生产环境会读取appsettings.Production.json中的对应值,Swagger UI直接显示当前环境的默认值。
- 如果配置项在appsettings根节点,直接用
_config["SomethingDefault"]读取即可,无需嵌套路径。
内容的提问来源于stack exchange,提问作者Puchacz
相关产品推荐
相关产品推荐

