ASP.NET Core中用Swashbuckle能否同时暴露Swagger2.0和OpenAPI3格式的JSON?
实现方案
可以实现,只需分别配置两个独立的Swagger中间件实例,分别指定序列化规则和路由模板即可,具体操作如下:
步骤1:服务注册(Program.cs/Startup.cs ConfigureServices 段)
builder.Services.AddSwaggerGen(options => { // 只需注册一次API文档信息即可 options.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "你的API服务名称", Version = "v1" }); // 其余原有SwaggerGen配置(如注释导入、鉴权配置等)保持不变 });
步骤2:中间件配置(Program.cs/Startup.cs Configure 段)
不要使用默认的无参UseSwagger()调用,改为分别两次调用UseSwagger,单独配置各自的规则:
// 配置OpenAPI 3.x格式的暴露端点 app.UseSwagger(options => { options.RouteTemplate = "swagger/{documentName}/openapi/swagger.json"; options.SerializeAsV2 = false; }); // 配置Swagger 2.0格式的暴露端点 app.UseSwagger(options => { options.RouteTemplate = "swagger/{documentName}/swagger2/swagger.json"; options.SerializeAsV2 = true; }); // 后续UseSwaggerUI等其余原有配置保持不变
效果验证
配置完成后:
- 访问
/swagger/v1/openapi/swagger.json返回 OpenAPI 3.x 格式的API文档 - 访问
/swagger/v1/swagger2/swagger.json返回 Swagger 2.0 格式的API文档
两份文档的API数据完全一致,仅输出格式不同,可同时满足遗留系统适配和新场景的标准要求。
注意事项
- 两次
UseSwagger的调用顺序无特殊要求,只要路由模板不冲突即可正常生效 - 若存在多版本API,无需额外修改配置,路径中的
{documentName}参数会自动匹配已注册的所有版本号,生成对应版本的两种格式文档
内容的提问来源于stack exchange,提问作者Dmitry S.
相关产品推荐
相关产品推荐

