我已经阅读了很多相互矛盾的答案,但仍然没有说清楚。 我有一个.net核心1.1网络应用程序,它可以为各种数据源提供大量外部API。我的实施使用DI传递自定义" webclient"每个控制器的类,它在内部为每个请求创建和配置一个httpclient(在使用块内)。我在服务器上看到大量空闲连接,所以我很确定这会导致这些。我也有一些问题,.net核心应用程序崩溃,不再响应,所以我想知道是否有太多连接打开正在创建此问题。
我意识到httpclient可以重复用于许多连接,但我不清楚几件事情。我已经读过,重复使用相同的httpclient对胖客户端应用程序来说真的更有用,而且由于Web请求非常平行,因此对Web应用程序没有用处。我还读到你想要缓存相同的httpclient以便重用不同的URL,但是我的网址使用查询字符串来传递参数,所以这并不意味着每个完全合格的URL都是独一无二的。 ?
我的想法是可能为我正在访问的api的每个基本域名缓存一个httpclient实例,但我还没有找到确认,如果这会给我带来好处的话。寻找使用单个httpclient实例。我认为我的目标是重用闲置的连接,这会实现这一目标吗?
我还遇到了一个类似于我正在做的解决方案的引用,这些解决方案会缓存这些实例,但随后会检查它们中的任何一个是否已在某个时刻处置,并根据需要重新创建它们。
似乎这应该很容易,但那里有大量相互矛盾的信息!
答案 0 :(得分:1)
HttpClient可能会在应用程序的生命周期内或更长时间内保持打开状态,即使它确实实现了IDisposable。因此,您使用单个HttpClient实例是正确的,因为您可以保证在任何时候只打开一个连接。
.NET Core具有DI的辅助功能。如果您使用以下内容,您的webclient的单例实例将被注入到使用它的所有类中。这意味着每个类都将使用webclient对象的相同实例,因此使用相同的httpclient。
在startup.cs ConfigureServices函数中使用以下命令:
services.AddSingleton<IWebClient>(new webclient(params));
或
services.AddSingleton<IWebClient, webclient>();
Singleton终身服务是在他们第一次创建时创建的 请求(或者在指定实例时运行ConfigureServices时) 然后每个后续请求将使用相同的实例。 如果您的应用程序需要单例行为,则允许服务 建议使用容器来管理服务的生命周期而不是 实现单例设计模式和管理对象 你自己在课堂上的一生。