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

Asp.Net Core 2.0中Swagger/Swashbuckle虚拟目录配置异常排查

解决ASP.NET Core 2.0 Web API部署到IIS虚拟目录后Swagger JSON 404问题

看起来你遇到的核心问题是Swagger UI能加载,但swagger.json文件返回404,这是因为部署到IIS虚拟目录后,你配置的SwaggerEndpoint用了绝对路径/swagger/v1/swagger.json——这个路径会直接指向服务器的根目录(比如http://your-server/swagger/v1/swagger.json),而不是虚拟目录下的实际路径(http://your-server/your-virtual-dir/swagger/v1/swagger.json)。

下面给你两个可行的解决方案,按顺序尝试即可:

方案一:使用相对路径配置SwaggerEndpoint

这是最简单的修复方式,只需要修改Configure方法里的SwaggerUI配置,把绝对路径改成相对路径:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    app.UseSwagger();
    app.UseSwaggerUI(c => {
        // 用相对路径替代绝对路径,会基于当前Swagger UI页面的路径自动拼接
        c.SwaggerEndpoint("./v1/swagger.json", "Employee Service API");
    });
    app.UseMvc();
}

相对路径./v1/swagger.json会自动适配虚拟目录的路径,最终指向your-virtual-dir/swagger/v1/swagger.json,完美解决路径不匹配的问题。

方案二:动态获取应用基路径(相对路径不生效时用)

如果相对路径没起作用,你可以通过IHttpContextAccessor动态获取应用的基路径,然后手动拼接Swagger的路径:

  1. 首先在ConfigureServices里注册IHttpContextAccessor服务:
public void ConfigureServices(IServiceCollection services) {
    services.AddCors();
    // 添加HttpContextAccessor服务
    services.AddHttpContextAccessor();
    services.AddSwaggerGen(c => {
        c.DescribeAllEnumsAsStrings();
        c.IncludeXmlComments($"{System.AppDomain.CurrentDomain.BaseDirectory}/EmployeeService.xml");
        c.SwaggerDoc("v1", new Info { Version = "v1", Title = "Employee Service" });
    });
    // ...其他配置
}
  1. 然后在Configure方法里动态获取基路径并配置Swagger:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
    // 获取应用的基路径(也就是虚拟目录的名称)
    var basePath = httpContextAccessor.HttpContext.Request.PathBase.Value;

    // 配置Swagger的JSON文件路径,带上基路径
    app.UseSwagger(c => {
        c.RouteTemplate = $"{basePath}/swagger/{{documentName}}/swagger.json";
    });

    // 配置Swagger UI的端点,同样带上基路径
    app.UseSwaggerUI(c => {
        c.SwaggerEndpoint($"{basePath}/swagger/v1/swagger.json", "Employee Service API");
    });

    app.UseMvc();
}

额外检查项

  • 确认IIS虚拟目录的应用程序池设置为无托管代码(因为ASP.NET Core是自托管应用,IIS仅作为反向代理);
  • 你的Swashbuckle.AspNetCore 2.3.0和.NET Core 2.0.3版本是兼容的,无需强制升级,但如果后续遇到其他问题,可以考虑升级到对应分支的最新补丁版本。

部署后再次访问{server}/{virtualdirectory}/swagger,应该就能正常加载API文档了。

内容的提问来源于stack exchange,提问作者reallyJim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:00:27