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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:55:26