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

3
当处理 HttpClient 时,可能会遇到“套接字耗尽”问题。因此,标准建议是尽可能重用客户端。
所以我很惊讶地发现官方的 Blazor 模板(dotnet new blazorwasm)在 Program.cs 中使用了这个作用域工厂。
builder.Services.AddScoped(sp =>
  new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

我甚至使用了IDisposableAnalyzers分析器库来检查这些内容,并且它警告要将该行替换为单个实例。
为什么模板要这样写?
1个回答

4

这是我发现的内容。

长期以来,由于套接字耗尽问题,一直建议重用HttpClient

但是 Blazor 的HttpClient不使用TCP进行连接,而是使用浏览器的 Fetch API。根据MDN,Fetch API是基于JavaScript的:

Fetch API提供了一个JavaScript界面,用于访问和操作HTTP管道的部分,例如请求和响应。 它还提供了一个全局fetch()方法,提供了一种跨网络异步获取资源的简单、逻辑方式。

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

因此,Blazor模板使用工厂创建多个实例。

简而言之:这应该是安全的。

我唯一的担忧是上述内容基于Blazor文档,但框架文档中的HttpClient并未提及针对Blazor的特殊行为。(我想知道这是如何工作的 - 也许Blazor SDK对HttpClient有不同的实现方式?)

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


dot net文档是开源的;您可以提交问题来添加注释,如果他们同意,甚至可以通过进行更改并提交PR来提供帮助。 - Caius Jard
1
@CaiusJard 是的,我本来就想这么做。我已经在文档存储库上提交了一个问题(https://github.com/dotnet/dotnet-api-docs/issues/8021),要求更新 HttpClient 框架文档页面。 - lonix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接