c# - .Net Core 3.1 IHttpClientFactory/HttpClient 第一次请求慢
问题描述
我有一个 .Net Core 3.1 应用程序。在应用程序中,我使用 IHttpClientFactory 创建一个 HttpClient。当我使用 SendAsync 拨打电话时,第一个请求需要 2 秒以上,而后续请求需要不到 100 毫秒。这对于生产应用程序来说是不可接受的性能。
我还注意到,如果我有一段时间没有提出任何请求,就会发生这种情况。我遇到了 PooledConnectionIdleTimeout 属性,默认为 2 分钟,我可以延长该时间,但这仅适用于已经存在的池连接,而不是在需要创建新连接时。
我在我的 Startup.cs 中配置 HttpClient,如下所示:
services.AddHttpClient("Default")
.ConfigurePrimaryHttpMessageHandler(() =>
{
return new SocketsHttpHandler
{
UseCookies = false,
AllowAutoRedirect = false,
MaxConnectionsPerServer = int.MaxValue,
UseProxy = false
};
});
我有一个单例包装类,其中包含一个调用 SendAsync 的方法:
public async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken = default)
{
var client = m_HttpClientFactory.CreateClient("Default");
return await client.SendAsync(request, completionOption, cancellationToken).ConfigureAwait(false);
}
我缺少某种配置吗?或者我可以做一些热身,以便第一个请求不会花费很长时间?
更新:已经几个月了,我不记得所有细节,但考虑到最近的评论,我决定发布我的发现和解决方法。
我发现使用 IP 地址作为主机名而不是服务器名时不会出现此问题。就我而言,我几乎总是调用 localhost,所以我比较了我应该联系的主机名,如果它与本地系统的主机名匹配,我将主机更改为 127.0.0.1。
IIRC,.Net Core 逻辑将尝试获取服务器名称的所有 IP,然后逐个遍历每个 IP,并尝试连接成功。根据它必须循环的次数,每次失败的尝试都会增加 1 秒的时间。当我在我的系统上启用 IPv6 时,它可能尝试的 IP 数量翻了一番。
希望对您有所帮助,如果听起来含糊不清,我们深表歉意。有一阵子了 :)
解决方案
推荐阅读
- mongodb - 已解决:在另一个 Schema 中使用 Schema 不起作用。错误:CastError:转换为 [ObjectId] 的值失败
- javascript - 如何使查询字符串中包含“{”的 CDN URL 无效
- php - Woocommerce/WordPress 和 ACID
- python - 在 django 中将数据发送到下一页的表单
- python - 如何使用 FFmpeg 将 RTMP 流转换为视频文件?
- c# - 如何访问 Firebase 安全规则中的自定义元数据进行存储
- r - 从R中的一系列数字中创建一个逗号分隔的字符串
- linux - Vim 加载所有包含字符串的文件
- flutter - 如何在 if else 中显示两个 SizedBox()?
- java - 如何通过Java在服务器端获取自定义HTTP请求头