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

IIS部署服务运行healthCheck时出现无效请求URI报错

问题产生原因
  • 你在AddHealthCheckEndpoint中配置的是相对路径/CheckPoints,HealthChecksUI的后台定时拉取服务会定期主动拉取健康检查结果,而非依赖用户的请求上下文
  • 本地localhost运行时,要么是用自宿主,要么是IIS Express部署在站点根目录,组件可以默认获取到当前站点的根地址,自动拼接相对路径生成合法的绝对URI,所以运行正常
  • 部署到IIS后出现报错,通常是以下两种场景导致组件无法生成合法绝对URI:
    • 应用部署在IIS的子应用下而非站点根目录,比如站点根地址为http://xxx.com,应用部署在http://xxx.com/myapp路径下,组件无法自动识别子应用前缀完成路径拼接
    • IIS的请求头转发配置缺失,组件脱离请求上下文时无法拿到当前站点的协议、域名等基础信息,无法完成相对路径到绝对路径的转换
修复方案

方案1:配置绝对路径的健康检查端点(兼容性最高,最稳妥)

你可以结合配置文件做多环境适配,本地和IIS环境读取对应环境的端点地址,不需要修改代码逻辑:

// 从配置文件读取对应环境的端点地址,比如IIS环境的配置写在appsettings.Production.json中
var healthCheckEndpoint = builder.Configuration["HealthCheckEndpoint"];
services.AddHealthChecksUI(s =>
{
   s.AddHealthCheckEndpoint("Validations", healthCheckEndpoint);
}).AddInMemoryStorage();

如果IIS部署地址固定,也可以直接写死绝对地址:

// 根站点部署写法
s.AddHealthCheckEndpoint("Validations", "http://你的IIS站点域名/CheckPoints");
// 子应用部署写法,替换成你实际的子应用路径
s.AddHealthCheckEndpoint("Validations", "http://你的IIS站点域名/子应用路径/CheckPoints");

方案2:配置全局BaseAddress

直接给HealthChecksUI组件设置全局根地址,组件会自动拼接根地址和相对路径生成可用的绝对URI:

services.AddHealthChecksUI(s =>
{
   // 同样支持从配置文件读取不同环境的根地址
   s.SetBaseAddress("http://你的IIS站点域名");
   // 子应用部署可以把前缀写到BaseAddress里,比如s.SetBaseAddress("http://你的IIS站点域名/子应用路径");
   s.AddHealthCheckEndpoint("Validations", "/CheckPoints");
}).AddInMemoryStorage();

方案3:配置请求头转发(适合不想硬编码地址的场景)

如果站点有动态域名需求不想硬编码地址,可以配置ASP.NET Core的请求头转发,让组件可以正确拿到站点的协议、域名、路径信息:

  1. 先在ConfigureServices中添加请求头转发配置:
services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.All;
    // 生产环境建议把IIS反向代理的IP加到KnownProxies列表,避免安全风险
});
  1. 在Configure方法的最开头(必须放在所有其他中间件之前)启用请求头转发:
app.UseForwardedHeaders();
  1. 同步确认IIS的ASP.NET Core托管模块已经开启了请求头转发配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:27:02