【发布时间】:2022-01-13 14:10:58
【问题描述】:
当我在每个请求上创建一个新的 HttpClient 对象时,我得到了
很快就得到了回应。
我知道我们不应该在每个请求上创建一个新的HttpClient,因此我开始使用HttpClientFactory 中的HttpClient 并在每个请求上注入HttpClient,但令人惊讶的是性能非常糟糕。
Global.asax
var services = new ServiceCollection();
services.AddHttpClient();
builder.Populate(services);
var autofacContainer = builder.Build();
Sample.asmx
方法 1:响应时间为 1.5 秒
var client_ = DependencyInjector.Provider.RequestLifetime.Resolve<HttpClient>();;//Inject
using (var request_ = new System.Net.Http.HttpRequestMessage())
{
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
方法 2:响应时间为 0.5 秒
var client_ = new HttpClient();
using (var request_ = new System.Net.Http.HttpRequestMessage())
{
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
使用 .Network 4.8。有什么建议吗?
【问题讨论】:
-
当您分析代码时,哪一行花费了额外的时间?您的 DI 调用很可能是缓慢的部分。 (也是an anti-pattern:只要有可能,依赖项应该被注入到控制器或方法中,而不是显式地从服务定位器中获取。)
-
SendAsync 需要时间。由于我使用的是 asp.net 旧 ASMX,因此我没有选择从构造函数注入依赖项。
标签: c# dotnet-httpclient .net-framework-4.8