为什么HttpClientBaseAddress不能工作?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (53)

考虑以下代码,其中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...。但事实并非如此。

经过一番研究,我发现这个问题和答案:带有BaseAddress的HttpClient。建议是/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");
}

但还是不起作用。

提问于
用户回答回答于

结果表明,在包含或排除尾随或前导斜杠的四种可能排列中,BaseAddress和传递给GetAsync方法-或任何其他方法HttpClient---只1置换有效。你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.

用户回答回答于

参考分辨率由RFC 3986统一资源标识符(URI):泛型语法。而这正是它应该如何运作的。要保留基URI路径,需要在基URI的末尾添加斜杠,并在相对URI的开头删除斜杠。

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

5.2.3.。合并路径上面的伪代码引用了一个“合并”例程,用于将相对路径引用与基URI的路径合并。这方面的工作如下:

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

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

扫码关注云+社区