我正在建立一个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个实例:SubClient2
SubClient3
HttpClient
HttpClient
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"));
我该如何解决?
您正在使用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] 删除。
我来说两句