.NET Core 8部署IIS后自定义域名下Swagger UI异常求助
问题分析与解决方案
你的问题核心在于Swagger UI配置中硬编码了应用前缀/CoreAPI,导致自定义域名访问时路径不匹配:
- 当用
http://domain/swagger/index.html访问时,Swagger UI会请求/CoreAPI/swagger/v1/swagger.json,但域名绑定的应用根目录是/而非/CoreAPI,所以找不到资源; - 当用
http://domain/CoreAPI/swagger/index.html访问时,域名站点的根目录已经是CoreAPI应用的根,额外加的/CoreAPI会导致路径重复,触发404。
以下是具体解决步骤:
1. 动态配置应用路径基(PathBase)
在Program.cs中添加动态PathBase配置,适配开发环境、IP访问(带/CoreAPI前缀)和域名访问(无前缀)的场景:
var builder = WebApplication.CreateBuilder(args); // 注册请求上下文访问服务 builder.Services.AddHttpContextAccessor(); // 其他服务配置(AddControllers、AddSwaggerGen等)... var app = builder.Build(); // 从配置文件读取PathBase,比如appsettings.json中添加"PathBase": "/CoreAPI"(IP访问场景用) var pathBase = app.Configuration.GetValue<string>("PathBase") ?? string.Empty; if (!string.IsNullOrEmpty(pathBase)) { app.UsePathBase(pathBase); }
2. 修改Swagger UI配置,使用动态路径
去掉硬编码的/CoreAPI前缀,基于当前应用的PathBase动态生成Swagger资源路径:
app.UseSwaggerUI(c => { var httpContextAccessor = app.Services.GetRequiredService<IHttpContextAccessor>(); var pathBase = httpContextAccessor.HttpContext?.Request.PathBase.Value ?? string.Empty; // 动态构造swagger.json的访问路径 c.SwaggerEndpoint($"{pathBase}/swagger/v1/swagger.json", "Base"); c.SwaggerEndpoint($"{pathBase}/swagger/v2/swagger.json", "Main"); c.DisplayRequestDuration(); // 自定义样式和脚本也使用动态路径 c.InjectStylesheet($"{pathBase}/swagger-ui/swagger-custom.css"); c.InjectJavascript($"{pathBase}/swagger-ui/swagger-custom.js"); // 统一Swagger UI的访问入口为/swagger c.RoutePrefix = "swagger"; });
3. 调整Swagger文档生成配置(可选但推荐)
确保Swagger生成的文档中服务器地址正确,避免请求路径错误:
app.UseSwagger(c => { c.PreSerializeFilters.Add((swaggerDoc, httpReq) => { // 动态设置Swagger文档中的服务器地址,适配当前请求的域名/IP和PathBase swaggerDoc.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"{httpReq.Scheme}://{httpReq.Host.Value}{httpReq.PathBase}" } }; }); });
4. IIS站点配置检查
- 如果自定义域名要直接通过
http://domain/swagger访问:将IIS站点的物理路径指向你的CoreAPI应用发布目录,虚拟目录设置为根目录(/),无需额外前缀。 - 如果要保留IP访问的
http://serverIP/CoreAPI/swagger路径:将该应用的虚拟目录设置为/CoreAPI,同时在appsettings.json中添加"PathBase": "/CoreAPI"。
完成以上配置后,无论用IP(http://serverIP/CoreAPI/swagger)还是自定义域名(http://domain/swagger)都能正常访问Swagger UI,且资源请求不会出现404错误。
内容的提问来源于stack exchange,提问作者Snoop
相关产品推荐
相关产品推荐

