.NET 6 Web API中HttpClient的HttpRequestMessage URI格式无效问题
问题原因及解决办法
核心问题
出现这个错误的核心原因有两个关键点,缺一不可:
1. HttpRequestMessage构造时未明确指定相对URI类型
直接用字符串"MyAction/Get"作为RequestUri参数时,.NET会默认尝试将其解析为绝对URI,但该字符串缺少协议头(如https://),导致URI格式验证失败,抛出错误。
2. 需确保BaseAddress的结尾斜杠配置正确
虽然你提到已配置带斜杠的BaseAddress,但仍需确认注入代码中BaseAddress确实是以/结尾,否则拼接相对路径时会出现地址拼接错误(比如变成https://localhost:7122MyAction/Get)。
具体修复代码
第一步:确认HttpClient注入时的BaseAddress配置
确保注入代码中BaseAddress的URI结尾包含斜杠:
// Program.cs中的注入代码 builder.Services.AddHttpClient<IMyService, MyService>(client => { // 必须以斜杠结尾,保证相对路径拼接正常 client.BaseAddress = new Uri("https://localhost:7122/"); });
第二步:修正MyService中HttpRequestMessage的创建方式
在Search方法中,明确指定相对URI的类型:
public class MyService : IMyService { private readonly HttpClient _httpClient; public MyService(HttpClient httpClient) { _httpClient = httpClient; } public async Task Search() { // 明确将路径标记为相对URI,避免.NET尝试按绝对URI解析 var request = new HttpRequestMessage( HttpMethod.Get, new Uri("MyAction/Get", UriKind.Relative) ); var response = await _httpClient.SendAsync(request); // 后续处理逻辑... } }
替代简化写法
如果不需要手动构建HttpRequestMessage,可以直接使用HttpClient的快捷方法,它会自动处理相对路径与BaseAddress的拼接:
public async Task Search() { var response = await _httpClient.GetAsync("MyAction/Get"); // 后续处理逻辑... }
内容的提问来源于stack exchange,提问作者TheBoubou
相关产品推荐
相关产品推荐

