gpt4 book ai didi

c# - .Net Core HttpClientFactory 用于多种 API 服务

转载 作者:行者123 更新时间:2023-12-03 16:48:04 26 4
gpt4 key购买 nike

我有一个 .Net Core 项目需要连接到大约 4 个不同的 API 服务,我不是任何 HttpClient 代码的专家,但据我发现,您通常只想重用一个实例你的 HttpClient 的。据我所知,普遍的共识是在.Net Core 中使用 HttpClientFactory,方法是在 Startup 类中注册它,然后使用 DI 请求它。
现在,除了 BaseAddress url 之外,我的大多数默认 header 等通常都相同,当连接到 4 个 diff API 服务时,我应该如何处理?我应该注册 4 个不同的命名客户端还是让一个客户端预先设置所有默认信息,然后根据需要手动配置它,例如配置地址?
一般问题是因为我对此很陌生,据说可以重复使用 HttpClient 的一个实例。

  • 如果我为每个 API 服务创建 4 个不同的命名客户端,当我调用 .CreateClient() 方法时,这不会创建 4 个 HttpClient 实例吗?
  • .CreateClient() 每次调用时都会创建一个新实例,如果说我需要对一个 API 服务进行 3 次不同调用,这是否会破坏拥有一个 HttpClient 实例的目的,每个调用都会调用 . CreateClient() 建立某种连接,这将创建 3 个 HttpClient 实例?

  • 任何帮助澄清将不胜感激,
    谢谢!

    最佳答案

    使用目的IHttpClientFactory不是重用 HttpClient 的实例.相反,它是重用(通过池化)HttpMessageHandler 的实例。 (实际上是 HttpClientHandler ,它源自抽象的 HttpMessageHandler ),它是管理 HTTP 连接和套接字的底层对象。 This diagram来自 Microsoft Docs 很好地展示了这一点。
    您担心频繁调用IHttpClientFactory.CreateClient()将产生与频繁调用 new HttpClient() 相同的问题.然而,这种情况并非如此。正如 Microsoft docs 所解释的那样,频繁调用new HttpClient()的原因将导致套接字耗尽的是,此构造函数将创建 HttpMessageHandler 的新实例:

    However, the issue isn't really with HttpClient per se, but with the default constructor for HttpClient, because it creates a new concrete instance of HttpMessageHandler, which is the one that has sockets exhaustion and DNS changes issues mentioned above.


    你可以从 source code看到的 IHttpClientFactory它不使用 HttpClient 的无参数构造函数在 CreateClient() .相反,它得到 HttpMessageHandler从池中注入(inject)到创建的 HttpClient .
    无论您使用的是类型化客户端还是命名客户端,都应该像使用临时对象一样使用 HttpClient 实例:创建它的成本很低,而且您不需要长时间缓存它。

    关于c# - .Net Core HttpClientFactory 用于多种 API 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63820819/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com