【发布时间】:2018-11-11 00:58:04
【问题描述】:
我已经阅读了很多关于此的相互矛盾的答案,但仍然没有直截了当。 我有一个 .net core 1.1 Web 应用程序,它为各种数据源提供了很多外部 api。我当前的实现使用 DI 将自定义的“webclient”类传递给每个控制器,该控制器在内部为每个请求(在 using 块内)创建和处理一个 httpclient。我在服务器上看到大量空闲连接,所以我很确定这是导致这些的。我也有一些 .net 核心应用程序崩溃并且不再响应的问题,所以我想知道打开的连接是否太多会造成这个问题。
我意识到 httpclient 可以用于许多连接,但我不清楚有几件事。我读过重用相同的 httpclient 对于胖客户端应用程序确实更有用,但由于 Web 请求的非常并行的性质,对 Web 应用程序没有那么有用。我还读到您希望缓存相同的 httpclient 以便重复使用不同的 URL,但我的 url 使用查询字符串来传递参数,所以这不意味着每个完全限定的 URL 都是独一无二的吗?
我的想法是可能为我正在访问的 api 的每个基本域名缓存一个 httpclient 实例,但我还没有找到确认这是否会给我使用单个 httpclient 实例带来的好处.我假设我的目标是重用空闲连接,这会实现吗?
我还发现了一个与我正在做的类似的解决方案的引用,该解决方案将缓存这些实例,然后检查它们中的任何一个是否已在某个时候被释放并根据需要重新创建它们。
看起来这应该是简单的事情,但那里有大量相互矛盾的信息!
【问题讨论】:
-
HttpClient 是线程安全的,因此可以将其保存为单例。但是,如果您使用 .NET Core 2.1,则可以使用 Http 客户端工厂。请参阅this blog post,它为您提供了更大的灵活性(命名客户端)以及允许您创建和处置 HttpClients(例如在 using 块内)而不会造成性能损失(将重用 HttpClientMessageHandlers,新创建和处置的 http 客户端本身,因为它们“便宜”)
-
有趣,可能是时候更新核心版本了......呃。谢谢
标签: c# .net asp.net-core dotnet-httpclient