【问题标题】:Can one instance of c# HttpClient handles all requests for sub domains?c# HttpClient 的一个实例可以处理子域的所有请求吗?
【发布时间】:2017-12-16 22:15:44
【问题描述】:

在我们的项目中,我们成功地使用了 HttpClient Per BaseAddress (Domain) 模式的一个实例。例如,对 api.externalservice.com 的所有请求都来自同一个 HttpClient。我们的代码旨在处理此类请求。 现在,我们需要调用两个不同的子域(api1.externalservice.comapi2.externalservice.com)。一个 HttpClient 实例是否仍足以处理这两个子域的请求和响应?还是我们需要两个 HttpClient 实例(一个用于 api1.externalservice.com,一个用于 api2.externalservice.com)?这对我们改变或不改变我们的代码结构很重要。

【问题讨论】:

  • 这取决于你如何使用 HttpClient。您不想重新设置默认标头或基地址,但您可以使用SendAsync 和新的HttpRequestMessages,无论线程如何。请参阅my blog post 或阅读其底部链接的文章。
  • 谢谢。在我在这里问这个问题之前,我阅读了您的博客文章 Crowcoder。但我的问题有点不同。如何为域的不同子域使用相同的 HttpClient?在我的场景中,BaseAddress 是 externalservice.com,我们应该访问的子域是 api1.externalservice.comapi2.externalservice.com
  • 如果只有几个,那么每个子域使用一个客户端应该没问题,但要使用相同的客户端,您根本不会设置 BaseAddress,您可以在 HttpRequestMessage 上设置 url而是。
  • 谢谢。现在很清楚了。我刚刚了解了您博客文章的食谱:您有许多不同的 API 可供调用,甚至可能经常在每个软件版本部分添加新的 API。

标签: c# httpclient


【解决方案1】:

一个实例很好。仅当您需要多线程时——那么您应该为每个线程拥有一个实例。

更新:(感谢柯克)

据此https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.110).aspx#Anchor_5有些方法甚至是线程保存。

并注意页面上的此评论:

HttpClient 旨在被实例化一次并在整个过程中重复使用 应用程序的生命周期。实例化一个 HttpClient 类 每个请求都将耗尽大量可用的套接字数量 负载。这将导致 SocketException 错误。

【讨论】:

  • 根据我的经验,HttpClient 在线程间共享时效果很好 (stackoverflow.com/questions/11178220/…) 我认为这个问题的重点是 BaseAddress 是否可以变化。
  • 我们知道它是线程安全的,或者在应用程序的整个生命周期中使用 HttpClient 的一个实例是好的。你是对的,柯克。我要求更改 HttpClient 的 BaseAddress 尤其是子域或任何其他实用方式。很明显,每个域只使用一个实例。我们也成功地使用了它。但是,当这个域有一个域和两个子域时,正确的方法是什么?将 HttpClient 的一个实例与子域一起使用有什么技巧吗?或者每个子域是否需要两个实例?
  • 在我的场景中,BaseAddress 是 externalservice.com我们应该访问的子域是 api1.externalservice.com 和 api2.externalservice.com 。我们可以通过这个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 2010-12-02
  • 2012-04-29
  • 2012-03-06
相关资源
最近更新 更多