我们使用HttpClient
调用项目中多个域的多个API。我正在创建一个用于所有这些 API 调用的通用HttpClient
。我对实现此方法的两种方法感到困惑:
- 为
HttpClient
创建一个单一实例类,并通过在get/post/put
方法中传递 API URI 来将其用于每次调用。 - 为
HttpClientHandler
创建一个将在所有HttpClient
之间共享的单一实例类,并通过设置BaseAddress
属性为每个域创建一个HtppClient
。现在,我们可以通过在get/post/put
方法中传递相对路径来调用 API。
哪一个是更好的方法?
预设BaseAddress
有什么好处吗?如果不是,为什么提供此属性?
如果您选择选项 1,当然不应该使用该BaseAddress
,因为您会不断覆盖它,并且您必须避免两个线程在其中一个线程有机会发送其请求之前更新它。
如果选择选项 2,则可以为每个 API 配置一次HttpClient
(例如,从配置文件读取BaseAddress
和Timeout
(。然后,可以提供相对 uri,而无需为每个请求预置基址。
我想哪个更好取决于您是否希望能够为所有 API(选项 1(或每个 API(选项 2(配置Timeout
或 MaxResponseContentBufferSize
等属性,我没有明确的"这个更好"答案。
选项 3:每个 API(域(调用一个 HttpClient 实例怎么样?它比选项 2 更容易实现,仍然允许您为每个 API 使用一组不同的有状态属性(DefaultRequestHeaders
等(,并且仍然最大限度地减少周围开放套接字的数量,避免了这个臭名昭著的问题。这将是我的建议。
BaseAddress
仅存在,以便您可以对单个请求使用相对 URI 而不是绝对 URI。