设置`HttpClient`的`BaseAddress`属性有啥好处

Posted

技术标签:

【中文标题】设置`HttpClient`的`BaseAddress`属性有啥好处【英文标题】:What is the advantage of setting `BaseAddress` property of `HttpClient`设置`HttpClient`的`BaseAddress`属性有什么好处 【发布时间】:2018-01-19 10:31:33 【问题描述】:

我们在项目中使用HttpClient 调用多个域的多个API。我正在创建一个通用的HttpClient 用于所有这些 API 调用。我对实现此功能的两种方法感到困惑:

    HttpClient 创建一个单例类,并通过在get/post/put 方法中传递API URI 将其用于每次调用。 为HttpClientHandler 创建一个单例类,该类将在所有HttpClients 之间共享,并通过设置BaseAddress 属性为每个域创建一个HtppClient。现在我们可以通过在 get/post/put 方法中传递相对路径来调用 API。

哪种方法更好?

预设BaseAddress 有什么好处吗?如果没有,为什么提供这个属性?

【问题讨论】:

看看这里BaseAddress的例子:***.com/questions/23438416/… 【参考方案1】:

如果您选择选项 1,当然不应该使用 BaseAddress,因为您会一直覆盖它,并且您必须避免两个线程在其中一个有机会发送请求之前更新它.

如果您选择选项 2,您可以为每个 API 配置一次 HttpClient(例如,从配置文件中读取 BaseAddressTimeout)。然后可以提供相对 uri,而不必为每个请求添加基地址。

我猜哪个更好取决于您是否希望能够为所有 API(选项 1)或每个 API(选项 2)配置 TimeoutMaxResponseContentBufferSize 等属性,我没有确定的“这个更好”的回答。

【讨论】:

【参考方案2】:

选项 3 怎么样:每个 API(域)调用一个 HttpClient 实例。它比选项 2 更容易实现,仍然允许您使用一组不同的有状态属性 (@987654322 @等)每个API,并且仍然最小化周围打开的套接字的数量,避免this infamous problem。这是我的建议。

BaseAddress 仅存在,因此您可以对单个请求使用相对 URI 而不是绝对 URI。

【讨论】:

在选项 2 中创建 HttpClient 时,我没有看到传递通用 HttpClientHandler 的任何复杂性。我错过了什么吗? @ctor 只是你根本不需要明确地处理处理程序。再看选项 2,我认为我的建议是完全一样的,减去处理程序单例。我认为这对你没有任何好处,除非错过了什么。

以上是关于设置`HttpClient`的`BaseAddress`属性有啥好处的主要内容,如果未能解决你的问题,请参考以下文章

设置HttpClient的授权标头

重新使用 HttpClient 但每个请求的超时设置不同?

HttpClient库设置超时

HttpClient设置编码类型

HttpClient的Content-Type设置

如何为 HttpClient 请求设置 Content-Type 标头?