.NET Core 6中如何在Program.cs获取Swagger显示的swagger.json地址
.NET Core 6中在Program.cs访问Swagger JSON地址的方法
你已经完成Swagger的常规配置(builder.Services.AddSwaggerGen、app.UseSwagger、app.UseSwaggerUI),Swagger页面正常显示,下面提供两种在Program.cs中获取Swagger JSON地址/内容的方案,用于展示额外信息:
方案1:直接构造Swagger JSON的完整地址
Swagger默认的JSON文档路由为/swagger/{documentName}/swagger.json,其中documentName默认是v1(可在AddSwaggerGen配置中修改)。如果需要获取完整的绝对地址,可以通过请求上下文动态拼接:
// 在注册中间件时获取请求上下文,构造完整地址 app.Use(async (context, next) => { // 拼接当前请求环境下的swagger.json绝对地址 var swaggerJsonFullUrl = $"{context.Request.Scheme}://{context.Request.Host}/swagger/v1/swagger.json"; // 这里可将该地址用于后续逻辑,比如传递给SwaggerUI的自定义内容 await next(); });
如果你的Swagger配置了自定义路由前缀(比如把Swagger挂载到/docs路径下),需要对应修改拼接的路由部分:
var swaggerJsonFullUrl = $"{context.Request.Scheme}://{context.Request.Host}/docs/v1/swagger.json";
方案2:直接获取Swagger文档内容(无需HTTP请求)
如果你的需求是读取Swagger JSON的内容而非访问URL,推荐直接用Swagger内置的ISwaggerProvider服务生成文档对象,避免额外的HTTP请求开销:
// 先构建应用程序 var app = builder.Build(); // 创建服务作用域获取ISwaggerProvider using (var scope = app.Services.CreateScope()) { var swaggerProvider = scope.ServiceProvider.GetRequiredService<ISwaggerProvider>(); // 获取指定文档名称的Swagger文档对象(默认是v1) var swaggerDoc = swaggerProvider.GetSwagger("v1"); // 示例:用文档中的接口数量生成额外信息,展示在SwaggerUI上 var extraInfo = $"当前API共包含 {swaggerDoc.Paths.Count} 个接口"; // 后续将extraInfo传递给SwaggerUI的配置 app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); // 在SwaggerUI头部添加自定义额外信息 options.HeadContent = $"<div style='padding:10px; background:#f5f5f5;'>{extraInfo}</div>"; }); } // 其他中间件配置... app.UseSwagger(); app.UseAuthorization(); // ...
注意事项
- 如果修改过Swagger的文档名称(比如
AddSwaggerGen(c => c.SwaggerDoc("v2", ...))),要将GetSwagger和SwaggerEndpoint中的文档名称对应修改。 - 若要在
UseSwaggerUI中直接使用swaggerDoc的信息,需要保证服务作用域的创建顺序在UseSwaggerUI之前。
内容的提问来源于stack exchange,提问作者Michael EstrinOne
相关产品推荐
相关产品推荐

