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));
}
}
}