为什么HttpClient BaseAddress不起作用?

问题描述 投票:219回答:4

请考虑以下代码,其中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 with 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这里发生了什么?

c# .net dotnet-httpclient
4个回答
543
投票

事实证明,在包括或排除BaseAddress上的尾随或前向斜线的四种可能的排列中,以及传递给GetAsync方法的相对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奇怪引起的问题。


37
投票

参考分辨率由RFC 3986 Uniform Resource Identifier (URI): Generic Syntax描述。这正是它应该如何运作的。要保留基URI路径,您需要在基URI的末尾添加斜杠,并在相对URI的开头删除斜杠。

如果基URI包含非空路径,则合并过程会丢弃它的最后一部分(在最后一个/之后)。相关的section

5.2.3。合并路径

上面的伪代码指的是用于将相对路径引用与基URI的路径合并的“合并”例程。这完成如下:

  • 如果基URI具有已定义的权限组件和空路径,则返回由引用的路径连接的“/”组成的字符串;除此以外
  • 返回一个字符串,该字符串包含附加到基URI路径的最后一段之外的所有引用的引用路径组件(即,排除基URI路径中最右侧“/”之后的任何字符,或者排除整个基本URI路径,如果它不包含任何“/”字符)。

如果相对URI以斜杠开头,则称为绝对路径相对URI。在这种情况下,合并过程忽略所有基URI路径。有关更多信息,请查看5.2.2. Transform References部分。


0
投票

或者 - 根本不要使用BaseAddress。将整个网址放在GetAsync()中


0
投票

遇到HTTPClient的一个问题,即使这些建议仍无法进行身份验证。结果我需要在我的相对路径中追踪一个'/'。

var result = await _client.GetStringAsync(_awxUrl + "api/v2/inventories/?name=" + inventoryName);
var result = await _client.PostAsJsonAsync(_awxUrl + "api/v2/job_templates/" + templateId+"/launch/" , new {
                inventory = inventoryId
            });
© www.soinside.com 2019 - 2024. All rights reserved.