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 第一次请求慢的主要内容,如果未能解决你的问题,请参考以下文章
如何将 .net core Web API 项目添加到现有的 .NET core (3.1) Web Application 项目中?
NET Core 3.1 MVC 授权/身份验证,带有在单独的 Net Core 3.1 Web Api 中从外部获取的令牌 (JWT)
Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作
将项目从 2.2 更新到 3.1(缺少程序集)或如何在 .NET Core 中使用 API POST 请求时,PostAsJsonAsync()在 .Net Core 3.1 中不起作用 [重复]