gpt4 book ai didi

c# - HttpClient.BaseAddress 的用途是什么,为什么我不能在第一次请求后更改它

转载 作者:行者123 更新时间:2023-11-30 13:53:52 25 4
gpt4 key购买 nike

所以我们大多数人可能已经读到我们应该重用 HttpClient 的实例,而不是使用 using 并创建新实例。这意味着我可以在我的程序中创建一个 HttpClient 的实例,并在每个请求中使用完整的 uri 字符串调用 GetAsync。这引导我找到 HttpClientBaseAddress 属性。考虑以下代码:

HttpClient microsoftClient = new HttpClient() { BaseAddress = new Uri("https://www.microsoft.com/") };
HttpClient stackoverflowClient = new HttpClient() { BaseAddress = new Uri("https://stackoverflow.com/") };

var response = microsoftClient.GetAsync("about").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access microsoft.com/about from the microsoft client");

response = microsoftClient.GetAsync("trademarks").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access microsoft.com/trademarks from the microsoft client");

response = stackoverflowClient.GetAsync("company/about").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access stackoverflow.com/company/about from the stackoverflow client");

response = stackoverflowClient.GetAsync("https://www.microsoft.com/about").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access microsoft.com/about from the stackoverflow client");

microsoftClient.BaseAddress = new Uri("https://stackoverflow.com");
response = microsoftClient.GetAsync("company/about").Result;
Console.WriteLine($"I {((response.IsSuccessStatusCode) ? "can" : "cannot")} access stackoverflow.com/company/about from the microsoft client, after changing the BaseAddress");

直到最后一个 block ,此代码运行良好,即使使用带有 stackoverflow BaseAddress 的客户端访问 Microsoft。然而,当重新分配 BaseAddress 时,此代码在最后一个 block 的开头抛出 InvalidOperationException,说明

'This instance has already started one or more requests. Properties can only be modified before sending the first request.'

这引出了以下问题:

  1. 使用 BaseAddress 有什么好处?我总是可以在我的 GetAsync 调用中使用完整地址。是否只是为了方便/性能而不必构建完整的请求字符串?我的猜测是它只会在内部创建一个 ServicePoint,如 this blog post 的第一段所述。 (或类似的东西,因为帖子很旧)。
  2. 在发送第一个请求后,我们无法更改 HttpClient 的属性,尤其是 BaseAddress,内部发生了什么?如果使用此属性实际上会产生好处,这似乎很不方便。

最佳答案

对于 (1),一个常见的用例是与一个服务器交互的客户端。也许这是构建此客户端使用的后端 API。确切的详细信息将存储在客户端在启动期间读取的配置文件中。

我们可以直接访问配置,或者将从配置中读取的字符串注入(inject)到需要构建完整 URL 的每个地方。或者我们可以只配置要放入依赖注入(inject)容器的 HttpClient 的 BaseAddress,然后让消费位置注入(inject)该对象。这对我来说是一个有点意料之中的用例。

对于 (2),我认为没有技术限制。我认为这更多是为了拯救人们自己。由于设置了 BaseAddress 并导致实际请求通过例如发出GetAsync 是单独的操作,两段单独的代码同时做这样的事情是不安全的——你很容易得到比赛。因此,如果一开始就不允许这样的竞争,就更容易推断出可能共享单个 HttpClient 实例的多线程程序。

关于c# - HttpClient.BaseAddress 的用途是什么,为什么我不能在第一次请求后更改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51319777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com