.NET 8部署后Swagger UI获取swagger.json报404错误求助
问题分析与解决
问题原因
部署后应用存在基础路径/appname,但当前Swagger配置存在两个核心问题:
SwaggerEndpoint使用了绝对路径/swagger/v1/swagger.json,会直接指向https://baseUri/swagger/v1/swagger.json,而实际swagger.json的正确地址是https://baseUri/appname/swagger/v1/swagger.json- 未针对应用基础路径调整Swagger中间件的路由规则,导致swagger.json的访问路径不匹配
解决方案
修改Program.cs中的Swagger相关配置,适配应用的基础路径,以下是三种可行方案:
方案1:动态适配路径基址(推荐)
通过获取请求的PathBase,动态生成SwaggerEndpoint的地址,适配任意部署路径:
// 先注册HttpContextAccessor服务 builder.Services.AddHttpContextAccessor(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(c => { // 获取应用的路径基址(部署后的/appname) var pathBase = app.Services.GetRequiredService<IHttpContextAccessor>().HttpContext?.Request.PathBase.Value ?? string.Empty; // 拼接正确的swagger.json地址 c.SwaggerEndpoint($"{pathBase}/swagger/v1/swagger.json", "XXXX API V1"); c.RoutePrefix = "api/swagger"; });
方案2:使用相对路径
由于Swagger UI的路由前缀是api/swagger,可以使用相对路径直接指向swagger.json:
builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(c => { // 相对路径:从api/swagger向上一级,指向swagger/v1/swagger.json c.SwaggerEndpoint("../swagger/v1/swagger.json", "XXXX API V1"); c.RoutePrefix = "api/swagger"; });
方案3:手动设置路径基址(适合固定部署路径)
如果部署的应用路径固定为/appname,可以直接设置全局路径基址:
builder.Services.AddSwaggerGen(); var app = builder.Build(); // 设置应用基础路径 app.UsePathBase("/appname"); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "XXXX API V1"); c.RoutePrefix = "api/swagger"; });
验证
部署后检查以下地址是否正常访问:
- Swagger UI地址:
https://baseUri/appname/api/swagger - swagger.json地址:
https://baseUri/appname/swagger/v1/swagger.json
此时Swagger UI即可正确加载swagger.json文件。
内容的提问来源于stack exchange,提问作者choopau
相关产品推荐
相关产品推荐

