为什么 Blazor 模板使用工厂来创建 HttpClient 实例

Why does Blazor template use a factory to create HttpClient instances

当放置一个HttpClient时,可以运行进入“套接字耗尽”problem。因此,标准建议是尽可能重用客户端。

所以我很惊讶地发现官方 Blazor 模板 (dotnet new blazorwasm) 在 Program.cs:

中有这个作用域工厂
builder.Services.AddScoped(sp =>
  new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

我什至在使用专门检查此类内容的 IDisposableAnalyzers 分析器库,它会警告用单个实例替换该行。

为什么模板是这样写的?

这是我找到的。

由于 socket exhaustion problem.

,长期以来一直建议重复使用 HttpClient

但是 Blazor 的 HttpClient 不使用 TCP 进行连接,它使用 browser's Fetch API instead. And the Fetch API, according to MDN is JavaScript-based:

The Fetch API provides a JavaScript interface for accessing and manipulating parts of the HTTP pipeline, such as requests and responses. It also provides a global fetch() method that provides an easy, logical way to fetch resources asynchronously across the network.

所以原来的问题不存在,这意味着我们可以安全地使用任意数量的 HttpClient 个实例。

这就是 Blazor 模板使用工厂创建多个实例的原因。

TL;DR: 应该是安全的。

我唯一担心的是以上内容基于 Blazor 文档,但是 framework docsHttpClient 没有提及 Blazor 的这种特殊行为。 (我想知道这是如何工作的——也许 Blazor SDK 对 HttpClient 的实现与服务器 SDK 不同?)

如果我的分析有误,请告诉我。