ASP.NET Core Web API部署IIS后请求URI无效问题解决求助
问题解决:ASP.NET Core 6 Web API部署IIS后HttpClient URI无效错误
错误原因分析
错误提示An invalid request URI was provided. Either the request URI must be an absolute URI or BaseAddress must be set.,核心问题是调用GetAsync时传入的custAccountNoUrl不是合法的绝对URI,或者HttpClient实例未正确配置BaseAddress。本地运行正常但IIS部署后出错,大概率是配置读取不完整或URI拼接逻辑在IIS环境下出现异常。
具体修复方案
方案1:确保拼接出完整的绝对URI
检查custAccountNoUrl的拼接逻辑,确保最终生成完整的绝对地址:
- 先验证配置项
custAccountDetailUrl是否被正确读取。可在代码中添加日志输出,确认该值在IIS环境下是否为https://thirdpartyservice.com/api/Account/GetCustomerDetail/。 - 拼接accountNumber时,避免路径拼接错误(多斜杠/缺失斜杠),推荐用
Uri类安全拼接:
// 正确拼接绝对URI var baseUrl = _configuration["MyEndpoints:custAccountDetailUrl"]; var absoluteUri = new Uri(new Uri(baseUrl), accountNumber); var response = await _myClient.GetAsync(absoluteUri);
方案2:为HttpClient配置BaseAddress并使用相对路径
在Program.cs中注册HttpClient时直接设置BaseAddress,后续调用使用相对路径:
- 修改Program.cs的HttpClient注册代码:
builder.Services.AddHttpClient("MyThirdPartyClient", client => { var baseUrl = builder.Configuration["MyEndpoints:custAccountDetailUrl"]; client.BaseAddress = new Uri(baseUrl); });
- 在DataUtil中注入
IHttpClientFactory,创建指定HttpClient并调用:
private readonly IHttpClientFactory _httpClientFactory; public DataUtil(IHttpClientFactory httpClientFactory, IConfiguration configuration) { _httpClientFactory = httpClientFactory; // 其他初始化逻辑 } // 验证账户的方法 public async Task<bool> ValidateAccount(string accountNumber) { var client = _httpClientFactory.CreateClient("MyThirdPartyClient"); // 使用相对路径发起请求 var response = await client.GetAsync(accountNumber); // 后续响应处理逻辑 }
额外优化建议
- 避免用
.Result同步等待异步方法,改用await,防止IIS环境下出现死锁。 - 添加配置项空值/有效性检查:
var baseUrl = _configuration["MyEndpoints:custAccountDetailUrl"]; if (string.IsNullOrEmpty(baseUrl) || !Uri.IsWellFormedUriString(baseUrl, UriKind.Absolute)) { throw new InvalidOperationException("第三方服务地址配置无效"); }
内容的提问来源于stack exchange,提问作者Ayobamilaye
相关产品推荐
相关产品推荐

