You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:54:52