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的路径:
- 首先在
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" }); }); // ...其他配置 }
- 然后在
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
相关产品推荐
相关产品推荐

