更改 HttpClient 的基地址

12
当编写使用 HttpClient 的应用程序时,我遵循此篇文章的方法,换句话说,我不使用 using 而是使用静态 HttpClient。当我只想与一个服务器通信时,我没有遇到任何问题。(我将 IP 地址设置为 BaseAddress 并继续进行)。
现在,我遇到了这个问题相同的问题,即在开始使用 HttpClient 后无法更改 BaseAddress。
该问题的答案是解释不能这样做,您无法更改 BaseAddress。
因此,我的问题(与链接的问题不同,因此不是重复的)是如果我们想要更改 IP 地址以与其他服务器通信该怎么办?
我们应该实例化另一个 HttpClient 吗?(不,我们不会使用 using)。那么,我们应该如何正确进行?

4
如果不设置基础地址,只需使用完整的地址发出请求。这样,同一个HTTP客户端就可以用于所有请求,否则您需要为每个基础地址创建一个新的客户端,这也会破坏使用单个客户端的目的。 - Nkosi
实际上,您可以更改BaseAddress。至少在我的Net Core 3项目中是可以的。 _httpClient.BaseAddress = new Uri(newAddress); - Akmal Salikhov
BaseAddress 属性有一个 setter,因此您可以在 .NET 5 中更改它,但是只能在发送第一个请求之前更改(之后您将会收到异常,请参见源代码,特别是第 87 行的 CheckDisposedOrStarted() 调用)。 - Eric Mutta
2个回答

17

目前无法更改基地址。

接下来我们应该如何正确处理?

不要设置基地址,只需使用完整地址来发送请求。

这样就可以使用同一客户端进行所有请求,否则您需要为每个基地址创建一个新的客户端,这也会破坏单一客户端的优势。

在asp.net core 2+中,客户端工厂已经解决了与多个客户端相关的问题。

释放客户端并非强制性操作,但这样做将取消任何正在进行的请求,并确保在调用Dispose之后不能再使用给定的HttpClient实例。工厂负责跟踪和释放HttpClient实例使用的重要资源,这意味着HttpClient实例通常可以被视为不需要释放的.NET对象。

一个结果是,今天人们常用的一些处理HttpClient实例的常见模式,例如长时间保持单个HttpClient实例处于活动状态,现在不再需要了。关于工厂具体执行的内容以及解决了哪些模式的文档将会发布,但尚未完成。

已完成的文档 使用HttpClientFactory实现具有弹性的HTTP请求


那么我猜下一个问题是,如果我想从设置中获取服务器的IP地址并在运行过程中不更改它,最好的方法是什么?(我猜读取文本文件是可能的,但这是最好的方式吗?) - KansaiRobot

0

我通过创建一个新的HttpClient实例,成功地改变了BaseAddress

假设你在类中有一个保存HttpClient的句柄。

public HttpClient Client { get; set; }

接着在你的代码中:

public void InitializeMyStuffAndFetchBaseAddress() {
  Client = new HttpClient();
  // do something with the Client, let's say we
  // wanna fetch what's the base address we should use
  string url = "https://www.myserver.com/getaccess";
  string baseAddress = await Client.GetStringAsync(url);
  ...
  Client.Dispose();
  
  Client = new HttpClient();
  Client.BaseAddress = new Uri(baseAddress );
  ...
}

因此,就代码而言,即使您生成了一个新的HttpClient实例,使用Client对他们来说也是透明的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接