IIS部署服务运行healthCheck时出现无效请求URI报错
问题产生原因
- 你在
AddHealthCheckEndpoint中配置的是相对路径/CheckPoints,HealthChecksUI的后台定时拉取服务会定期主动拉取健康检查结果,而非依赖用户的请求上下文 - 本地localhost运行时,要么是用自宿主,要么是IIS Express部署在站点根目录,组件可以默认获取到当前站点的根地址,自动拼接相对路径生成合法的绝对URI,所以运行正常
- 部署到IIS后出现报错,通常是以下两种场景导致组件无法生成合法绝对URI:
- 应用部署在IIS的子应用下而非站点根目录,比如站点根地址为
http://xxx.com,应用部署在http://xxx.com/myapp路径下,组件无法自动识别子应用前缀完成路径拼接 - IIS的请求头转发配置缺失,组件脱离请求上下文时无法拿到当前站点的协议、域名等基础信息,无法完成相对路径到绝对路径的转换
- 应用部署在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的请求头转发,让组件可以正确拿到站点的协议、域名、路径信息:
- 先在ConfigureServices中添加请求头转发配置:
services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.All; // 生产环境建议把IIS反向代理的IP加到KnownProxies列表,避免安全风险 });
- 在Configure方法的最开头(必须放在所有其他中间件之前)启用请求头转发:
app.UseForwardedHeaders();
- 同步确认IIS的ASP.NET Core托管模块已经开启了请求头转发配置。
内容的提问来源于stack exchange,提问作者Kirtash666
相关产品推荐
相关产品推荐

