部署IIS时AspNetCore.HealthChecks.UI无法获取端点URI问题
AspNetCore.HealthChecks.UI IIS部署相对路径报错解决办法
问题根源
IIS托管环境下,HealthChecks.UI的静态资源请求上下文和健康检查端点的路由上下文存在差异——哪怕你直接在浏览器访问/healthchecks能拿到正常JSON响应,UI的后端请求逻辑也无法正确解析这种纯斜杠开头的相对路径,导致出现「无法从配置获取端点URI」的错误。
具体解决步骤
1. 修改配置文件用~/替代/
把appsettings.json里的健康检查Uri改成带~/的相对路径,让UI基于当前应用的虚拟路径(IIS站点的应用程序路径)解析地址:
{ "HealthChecksUI": { "HealthChecks": [ { "Name": "我的应用健康检查", "Uri": "~/healthchecks" } ], "EvaluationTimeInSeconds": 10, "MinimumSecondsBetweenFailureNotifications": 60 } }
2. 配置应用识别IIS虚拟路径
如果你的IIS站点设置了虚拟路径(比如/MyApp),在Program.cs里加上PathBase的配置,让应用适配IIS的路径规则:
var builder = WebApplication.CreateBuilder(args); // 注册健康检查服务 builder.Services.AddHealthChecks() .AddCheck<SampleHealthCheck>("示例检查"); builder.Services.AddHealthChecksUI() .AddInMemoryStorage(); var app = builder.Build(); // 读取IIS虚拟路径配置,没有则默认根路径 var pathBase = builder.Configuration["ASPNETCORE_PATHBASE"] ?? "/"; app.UsePathBase(pathBase); // 映射健康检查端点 app.MapHealthChecks("/healthchecks", new HealthCheckOptions { ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse }); // 映射UI页面 app.MapHealthChecksUI(options => { options.UIPath = "/healthchecks-ui"; }); app.Run();
3. 验证IIS站点配置
- 应用程序池必须设置为**.NET Core托管模式**(选择「无托管代码」)
- 如果站点有虚拟路径,确保
ASPNETCORE_PATHBASE环境变量或配置文件中填写了对应路径值 - 再次确认
/healthchecks能直接访问并返回正常JSON响应
4. 动态拼接地址的兜底方案
要是上面的配置仍有问题,可以在代码中动态生成健康检查地址,彻底避免硬编码:
builder.Services.AddHealthChecksUI(options => { var pathBase = builder.Configuration["ASPNETCORE_PATHBASE"] ?? "/"; options.AddHealthCheckEndpoint("我的应用健康检查", $"{pathBase}healthchecks"); }).AddInMemoryStorage();
这种方式会在应用启动时自动根据当前基地址拼接完整的端点路径,无需用户手动配置绝对地址。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

