【问题标题】:httpclient reuse in mvc.net core web app with multiple apis and querystrings具有多个 api 和查询字符串的 mvc.net 核心 Web 应用程序中的 httpclient 重用
【发布时间】:2018-11-11 00:58:04
【问题描述】:

我已经阅读了很多关于此的相互矛盾的答案,但仍然没有直截了当。 我有一个 .net core 1.1 Web 应用程序,它为各种数据源提供了很多外部 api。我当前的实现使用 DI 将自定义的“webclient”类传递给每个控制器,该控制器在内部为每个请求(在 using 块内)创建和处理一个 httpclient。我在服务器上看到大量空闲连接,所以我很确定这是导致这些的。我也有一些 .net 核心应用程序崩溃并且不再响应的问题,所以我想知道打开的连接是否太多会造成这个问题。

我意识到 httpclient 可以用于许多连接,但我不清楚有几件事。我读过重用相同的 httpclient 对于胖客户端应用程序确实更有用,但由于 Web 请求的非常并行的性质,对 W​​eb 应用程序没有那么有用。我还读到您希望缓存相同的 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


【解决方案1】:

HttpClient 可能在应用程序的生命周期或更长时间内保持打开状态,即使它确实实现了 IDisposable。因此,使用 HttpClient 的单个实例是正确的,因为可以保证在任何时候都只打开一个连接。

.NET Core 有 DI 的辅助函数。如果您使用以下内容,您的 webclient 的单例实例将被注入到使用它的所有类中。这意味着每个类都将使用相同的 webclient 对象实例,因此使用相同的 httpclient。

在您的 startup.cs ConfigureServices 函数中使用以下内容:

services.AddSingleton<IWebClient>(new webclient(params));    

services.AddSingleton<IWebClient, webclient>();

单例生命周期服务是在首次创建时创建的 请求(或者如果您指定实例,则在运行 ConfigureServices 时 那里),然后每个后续请求都将使用相同的实例。 如果您的应用程序需要单例行为,则允许服务 建议使用容器来管理服务的生命周期,而不是 实现单例设计模式并管理对象的 终生在课堂上。

Microsoft documentation for DI in .NET Core

【讨论】:

猜你喜欢
  • 2021-02-15
  • 2012-06-04
  • 2015-09-23
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 2010-09-11
相关资源
最近更新 更多