为什么 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 分析器库,它会警告用单个实例替换该行。
为什么模板是这样写的?
这是我找到的。
,长期以来一直建议重复使用 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 docs 和 HttpClient
没有提及 Blazor 的这种特殊行为。 (我想知道这是如何工作的——也许 Blazor SDK 对 HttpClient
的实现与服务器 SDK 不同?)
如果我的分析有误,请告诉我。
当放置一个HttpClient
时,可以运行进入“套接字耗尽”problem。因此,标准建议是尽可能重用客户端。
所以我很惊讶地发现官方 Blazor 模板 (dotnet new blazorwasm
) 在 Program.cs
:
builder.Services.AddScoped(sp =>
new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
我什至在使用专门检查此类内容的 IDisposableAnalyzers 分析器库,它会警告用单个实例替换该行。
为什么模板是这样写的?
这是我找到的。
,长期以来一直建议重复使用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 docs 和 HttpClient
没有提及 Blazor 的这种特殊行为。 (我想知道这是如何工作的——也许 Blazor SDK 对 HttpClient
的实现与服务器 SDK 不同?)
如果我的分析有误,请告诉我。