当处置HttpClient
,可能会遇到“套接字耗尽”的情况problem https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests。因此,标准建议是尽可能重用客户端。
所以我很惊讶地发现官方 Blazor 模板(dotnet new blazorwasm
)有这个范围工厂Program.cs
:
builder.Services.AddScoped(sp =>
new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
我什至正在使用I一次性分析仪 https://github.com/DotNetAnalyzers/IDisposableAnalyzers/blob/master/documentation/IDISP014.md#motivation专门检查此类内容的分析器库,并警告用单个实例替换该行。
模板为什么这么写?
这就是我发现的。
长期以来一直建议重复使用HttpClient
, 因为套接字耗尽问题 https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests.
但布拉佐尔的HttpClient
不使用 TCP 进行连接,它使用反而。根据 MDN,Fetch API 是基于JavaScript https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch:
Fetch API 提供了一个 JavaScript 接口,用于访问和操作 HTTP 管道的某些部分,例如请求和响应。它还提供了一个全局 fetch() 方法,该方法提供了一种简单、合乎逻辑的方法来通过网络异步获取资源。
所以原来的问题不存在,这意味着我们可以安全地使用尽可能多的HttpClient
我们想要的实例。
这就是 Blazor 模板使用工厂来创建多个实例的原因。
TL;DR:应该是安全的。
我唯一担心的是上述内容基于 Blazor 文档,但是框架文档 https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-6.0 for HttpClient
不要提及 Blazor 的这种特殊行为。 (我想知道这是如何工作的 - 也许 Blazor SDK 有不同的实现HttpClient
比服务器 SDK ?)
如果我的分析有误,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)