Net Core 3.1 IHttpClientFactory/HttpClient 第一次请求慢
Posted
技术标签:
【中文标题】Net Core 3.1 IHttpClientFactory/HttpClient 第一次请求慢【英文标题】:Net Core 3.1 IHttpClientFactory/HttpClient Slow on First Request 【发布时间】:2020-07-13 04:01:51 【问题描述】:我有一个 .Net Core 3.1 应用程序。在应用程序中,我使用 IHttpClientFactory 创建一个 HttpClient。当我使用 SendAsync 拨打电话时,第一个请求需要 2 秒以上,而后续请求需要不到 100 毫秒。这对于生产应用程序来说是不可接受的性能。
我还注意到,如果我有一段时间没有提出任何请求,就会发生这种情况。我遇到了 PooledConnectionIdleTimeout 属性,它默认为 2 分钟,我可以延长该时间,但这仅适用于已经存在的池连接,而不是在需要创建新连接时。 我在我的 Startup.cs 中配置了 HttpClient:
services.AddHttpClient("HttpClient",
h =>
h.BaseAddress = new Uri(Configuration["PythonUrl"]);
);
像这样使用 HttpClient:
var client = httpClientFactory.CreateClient("HttpClient");
var res = await client.GetAsync(nameof(Accounts).ToLower() + "/" + id.ToString() + "/");
当 "Configuration["PythonUrl"]" 包含 PC 名称时,像这样:
"AllowedHosts": "*",
"PythonUrl": "http://PC202003261059:8000/",
"url": "http://*:5000"
HttpClient 的第一个请求变得很慢。有什么办法可以避免这种情况吗?
【问题讨论】:
这貌似和HttpClient或者ClientFactory没什么关系,更有可能是webserver转起来或者dns解析或者其他什么问题,总之HttpClient里面没有开关说,GoFasterOnFirstLoad = true跨度> @TheGeneral 我不这么认为,我认为可能是由于httpclient的DNS解析 HttpClient 客户端 = new HttpClient(); var res = await client.GetAsync("PC202003261059:8000/accounts/2/"); 这样也会慢 第一次请求由于延迟初始化而变慢的情况并不少见。您始终可以在启动时执行一个虚拟请求,以便在处理实际流量之前预热您的服务。 @***.com/users/6765564/kelvin 先谢谢了,经过我的测试,发现可能是DNS造成的,但是不知道为什么httpclient用DNS变慢了。 【参考方案1】:我遇到了类似的问题,并找到了适合我的解决方案。 请注意,此解决方案仅适用于 IIS 托管的 WebApp。
在 IIS 中托管应用程序时,AppPool 负责实际运行它。但是,它仅在收到第一个请求时启动应用程序。这在大多数情况下都很好,因此是默认设置,但这会导致第一次请求很慢。
-
在 IIS 管理器中,右键单击运行您的应用程序池
应用并选择“高级设置”。将“开始模式”设置为“始终
正在运行'。
Rick-Click 您的网站并在“管理网站”下选择“高级
设置'。将“Preload Enabled”设置为“true”。
这应该会使第一个请求更快,并且不会在一段时间后让您的 AppPool 进入休眠状态。还应注意,这可能会影响托管在同一服务器上的其他应用的性能。
这个article 帮了我这个忙。
免责声明:由于多种原因(其中一些可能是客户端,如 DNS 请求,或与网络相关的丢包、互联网连接不良等),第一个请求可能仍然较慢... )。
【讨论】:
以上是关于Net Core 3.1 IHttpClientFactory/HttpClient 第一次请求慢的主要内容,如果未能解决你的问题,请参考以下文章