一尘不染

为什么HttpClient BaseAddress不起作用?

c#

考虑以下代码,其中BaseAddress定义了部分URI路径。

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api");
    var response = await client.GetAsync("/resource/7");
}

我希望这能向发出GET请求http://something.com/api/resource/7。但事实并非如此。

经过一些搜索,我找到了这个问题和答案:HttpClient与BaseAddress。建议将其放置/在末尾BaseAddress

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api/");
    var response = await client.GetAsync("/resource/7");
}

它仍然不起作用。这里是文档:HttpClient.BaseAddress这是怎么回事?


阅读 410

收藏
2020-05-19

共1个答案

一尘不染

事实证明,在四种可能的排列方式中,包括或排除BaseAddress传递给GetAsync方法的URI和相对URI的尾部或前导斜杠以及传递给该方法(或其他方法)的相对URI
HttpClient,只有 一种 排列有效。您 必须 在的末尾放置一个斜杠BaseAddress,并且 不能
在相对URI的开头放置一个斜杠,如以下示例所示。

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api/");
    var response = await client.GetAsync("resource/7");
}

即使我回答了自己的问题,但我仍然想在这里提供解决方案,因为再次,这种不友好的行为没有记录在案。我和我的同事在一天的大部分时间中都在尝试解决最终由这种奇怪的问题引起的问题HttpClient

2020-05-19