设置`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
创建一个单例类,该类将在所有HttpClient
s 之间共享,并通过设置BaseAddress
属性为每个域创建一个HtppClient
。现在我们可以通过在 get/post/put
方法中传递相对路径来调用 API。
哪种方法更好?
预设BaseAddress
有什么好处吗?如果没有,为什么提供这个属性?
【问题讨论】:
看看这里BaseAddress
的例子:***.com/questions/23438416/…
【参考方案1】:
如果您选择选项 1,当然不应该使用 BaseAddress
,因为您会一直覆盖它,并且您必须避免两个线程在其中一个有机会发送请求之前更新它.
如果您选择选项 2,您可以为每个 API 配置一次 HttpClient
(例如,从配置文件中读取 BaseAddress
和 Timeout
)。然后可以提供相对 uri,而不必为每个请求添加基地址。
我猜哪个更好取决于您是否希望能够为所有 API(选项 1)或每个 API(选项 2)配置 Timeout
或 MaxResponseContentBufferSize
等属性,我没有确定的“这个更好”的回答。
【讨论】:
【参考方案2】:选项 3 怎么样:每个 API(域)调用一个 HttpClient 实例。它比选项 2 更容易实现,仍然允许您使用一组不同的有状态属性 (@987654322 @等)每个API,并且仍然最小化周围打开的套接字的数量,避免this infamous problem。这是我的建议。
BaseAddress
仅存在,因此您可以对单个请求使用相对 URI 而不是绝对 URI。
【讨论】:
在选项 2 中创建HttpClient
时,我没有看到传递通用 HttpClientHandler
的任何复杂性。我错过了什么吗?
@ctor 只是你根本不需要明确地处理处理程序。再看选项 2,我认为我的建议是完全一样的,减去处理程序单例。我认为这对你没有任何好处,除非我错过了什么。以上是关于设置`HttpClient`的`BaseAddress`属性有啥好处的主要内容,如果未能解决你的问题,请参考以下文章