C# HttpClient在某些情况下修改基址

C# HttpClient在某些情况下修改基址,c#,.net,api,httpclient,uri,C#,.net,Api,Httpclient,Uri,基本上,我应该能够在HttpClient上设置一个绝对BaseAddress,然后使用相对Uri发送Http请求。我们期望相对的Uri会附加到基址上以进行Http调用。在大多数情况下都是这样。这个例子很好用 编辑:请参见底部。这似乎是URI构造方式中的奇怪行为。 var httpClient = new HttpClient() { BaseAddress = new Uri("http://restcountries.eu/rest/", UriKind.Absolute)

基本上,我应该能够在
HttpClient
上设置一个绝对
BaseAddress
,然后使用相对
Uri
发送Http请求。我们期望相对的
Uri
会附加到基址上以进行Http调用。在大多数情况下都是这样。这个例子很好用

编辑:请参见底部。这似乎是URI构造方式中的奇怪行为。

var httpClient = new HttpClient() { BaseAddress = new Uri("http://restcountries.eu/rest/", UriKind.Absolute) };
var requestMessage = new HttpRequestMessage(HttpMethod.Get, new Uri("v2", UriKind.Relative));
var httpResponseMessage = await httpClient.SendAsync(requestMessage);
var json = await httpResponseMessage.Content.ReadAsStringAsync();
小提琴手url:

获取HTTP/1.1

我有一个本地API。当我在本地API上运行等效程序时,调用会截断部分基址(“API”)

小提琴手url:

得到http://localhost/JsonPerson/GetApiPerson HTTP/1.1

为什么要删除“/Api”?

此代码符合本地API,工作正常:

var httpClient = new HttpClient() { BaseAddress = new Uri($"http://localhost/JsonPerson/", UriKind.Absolute) };
var requestMessage = new HttpRequestMessage(HttpMethod.Get, new Uri("Api/GetApiPerson", UriKind.Relative));
var httpResponseMessage = await httpClient.SendAsync(requestMessage);
var json = await httpResponseMessage.Content.ReadAsStringAsync();
小提琴手url:

得到http://localhost/JsonPerson/Api/GetApiPerson HTTP/1.1

这是一个奇怪的问题,我不明白为什么我会有这些不一致。。。对于本地和非本地uri,它是否对uri进行了不同的处理?我错过了什么

这是.NETCore3.1

看看这段代码,然后看看输出。这就是
HttpClient
在幕后所做的事情

using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var baseAddress = new Uri($"http://restcountries.eu/JsonPerson/Api", UriKind.Absolute);
            var resourceUri = new Uri($"GetApiPerson", UriKind.Relative);
            Console.WriteLine(new Uri(baseAddress, resourceUri));

            baseAddress = new Uri($"http://restcountries.eu/JsonPerson", UriKind.Absolute);
            resourceUri = new Uri($"Api/GetApiPerson", UriKind.Relative);
            Console.WriteLine(new Uri(baseAddress, resourceUri));

            baseAddress = new Uri($"http://restcountries.eu/rest/", UriKind.Absolute);
            resourceUri = new Uri($"v2", UriKind.Relative);
            Console.WriteLine(new Uri(baseAddress, resourceUri));
        }
    }
}
输出

事实证明这件事似乎和它有关


基地址的末尾加一个斜杠可以解决这个问题


然而,在我看来,这类代码似乎是
Uri
中的一个bug。我确信这会让很多人绊倒。

这看起来确实像一只虫子。我尝试了以下方法
HttpRequestMessage.RequestUri
,很快就放弃了:)也许值得向.NET repro报告。我现在正在查看代码,但它太令人困惑了!问题要简单得多。它与Url连接在一起。只需添加一个斜杠来终止Url部分:
http://restcountries.eu/JsonPerson/Api/
http://restcountries.eu/JsonPerson/
etc.IMO我们需要为
BaseAddress
添加斜杠,这很不直观。它在任何地方都有记录吗?请将您的发现作为答案发布,非常确定其他人会遇到这种情况,包括:)但您肯定会同意完全不同的
http://example.com/root/home.aspx
其他.aspx
组合应产生
http://example.com/root/other.aspx
,你不会吗?我上面的评论原来是乔恩·斯基特答案的剽窃版本。。。让我们考虑这个属性来评论(并且接近重复)。
using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var baseAddress = new Uri($"http://restcountries.eu/JsonPerson/Api", UriKind.Absolute);
            var resourceUri = new Uri($"GetApiPerson", UriKind.Relative);
            Console.WriteLine(new Uri(baseAddress, resourceUri));

            baseAddress = new Uri($"http://restcountries.eu/JsonPerson", UriKind.Absolute);
            resourceUri = new Uri($"Api/GetApiPerson", UriKind.Relative);
            Console.WriteLine(new Uri(baseAddress, resourceUri));

            baseAddress = new Uri($"http://restcountries.eu/rest/", UriKind.Absolute);
            resourceUri = new Uri($"v2", UriKind.Relative);
            Console.WriteLine(new Uri(baseAddress, resourceUri));
        }
    }
}