如何将一个HttpClient注入多个服务

洛林

我正在建立一个API的客户端。我的API相当大,因此我决定将其拆分为大约5个(私有)子客户端,每个子客户端涵盖API的不同部分。5个客户端使用起来不太舒服,因此我想将它们放在1(公共)之下ApiClient,这将作为这5个客户端之上的一种立面。问题是我可能应该HttpClient在所有这些子客户端之间共享一个据我所知,我可以做这样的事情:

services.AddHttpClient<SubClient1>(c => c.BaseAddress = new System.Uri("https://myapi.com"));

在上述代码行中,我SubClient1将使用已设置ApiClient的适当HttpClient实例注入我的公众BaseAddress现在,如何注册我的子客户端的所有5( ,SubClient1 ,...),所以他们每个人接收相同的我认为以下代码将创建5个实例:SubClient2SubClient3HttpClientHttpClient

services.AddHttpClient<SubClient1>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient2>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient3>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient4>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient5>(c => c.BaseAddress = new System.Uri("https://myapi.com"));

我该如何解决?

卡萨拉斯(Athanasios Kataras)

您正在使用HttpClientFactory,因此将的构造委派HttpClient给了工厂。

基于文档:https : //docs.microsoft.com/zh-cn/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

如先前代码中所示注册客户端服务,使DefaultClientFactory为每个服务创建一个标准HttpClient。

它是故意这样做的,以便您可以为每个服务配置客户端。

在资源方面,您是converted依的。那是客户工厂的初衷:

每次从IHttpClientFactory获取HttpClient对象时,都会返回一个新实例。但是,只要HttpMessageHandler的生存期未到期,每个HttpClient都使用IHttpClientFactory池化并重用的HttpMessageHandler来减少资源消耗。

最好合并处理程序,因为每个处理程序通常都管理自己的基础HTTP连接。创建过多的处理程序可能会导致连接延迟。一些处理程序还会无限期地保持连接打开,这可能会阻止处理程序对DNS更改做出反应。

如果您不想使用推荐的工厂方式,则可以执行以下操作:https : //nodogmablog.bryanhogan.net/2017/10/reusing-httpclient-with-dependency-injection/

public void ConfigureServices(IServiceCollection services)
{
    Uri endPointA = new Uri("http://localhost:58919/"); // this is the endpoint HttpClient will hit
    HttpClient httpClient = new HttpClient()
    {
        BaseAddress = endPointA,
    };

    ServicePointManager.FindServicePoint(endPointA).ConnectionLeaseTimeout = 60000; // sixty seconds

    services.AddSingleton<HttpClient>(httpClient); // note the singleton
    services.AddMvc();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将多个服务注入一个控制器?

如何将一个接口的多个实现注入到一个实现中

如何将服务的方法结果作为另一个服务的参数注入?

如何将多个服务映射到一个Kubernetes入口路径?

如何将一个Kubernetes LoadBalancer余额平衡到多个服务?

如何将httpClient注入实例化服务?

你如何将一个bean注入一个@Controller类

您如何将定制服务注入另一个定制服务?

当两者都属于同一模块时,如何将nestjs服务注入另一个服务?

如何将一个函数用于多个元素?

如何将一个分割成多个火花?

如何将多个参数放在一个 $ 中

如何将多个列表放入一个列表?

如何将一个列表分成多个列表?

如何将多个For循环重构为一个?

如何将多个目录合并为一个

如何将多个列表合并为一个?

是否建议将多个服务注入到一个类中?

将特定服务实例注入一个父组件中一个组件的多个实例中

如何将一个客户端连接到多个服务器套接字?

如何将一个域上的特定端口流量路由到多个 Azure 应用服务?

git:如何将一个本地仓库同步到多个远程服务器?

如何将同一个bean实例注入多个bean

春季如何将一个豆子注入一组豆子中?

如何将多个视频一个接一个地转换为AVI

春天如何将一个对象注入到另一个类对象?

在Spring 3.0中如何将属性从一个bean注入另一个bean?

如何将 RestTemplate 注入另一个类并对其进行测试?

如何将参数传递给CDI中另一个类的注入类?