第一个请求或空闲大约 100 秒后的请求非常慢,需要 15-30 秒。任何没有空闲的请求都需要不到一秒钟的时间。我对第一个请求花费时间感到满意,只是不是导致速度变慢的小空闲时间。
放缓并不是客户端独有的,如果我一直在一个客户端上发出请求,那么它在另一个客户端上保持快速。只有当所有人都闲置 100 秒时,它才会减速。
以下是我尝试过的一些更改:
它与 IIS 应用程序池回收无关,因为默认设置为 2000 万,应用程序的其余部分保持快速。
请求发送到与 AWS S3 通信以获取文件的 Web 服务。我在这一点上不知所措,我所有的研究都使我想到了我已经尝试过的上述几点。任何想法,将不胜感激!
这是方法:
`
//get httpclient singleton or create
var httpClient = HttpClientProvider.FileServiceHttpClient;
var queryString = string.Format("?key={0}", key);
var request = new HttpRequestMessage(HttpMethod.Get, queryString);
var response = httpClient.SendAsync(request).Result;
if (response.IsSuccessStatusCode)
{
var metadata = new Dictionary<string, string>();
foreach (var header in response.Headers)
{
//grab tf headers
if (header.Key.StartsWith(_metadataHeaderPrefix))
{
metadata.Add(header.Key.Substring(_metadataHeaderPrefix.Length), header.Value.First());
}
}
var virtualFile = new VirtualFile
{
QualifiedPath = key,
FileStream = response.Content.ReadAsStreamAsync().Result,
Metadata = metadata
};
return virtualFile;
}
return null;
最佳答案
默认空闲超时约为 1-2 分钟。之后,客户端必须与服务器重新握手。所以,你会发现100s后会变慢。
您可以使用套接字处理程序来延长空闲超时。
var socketsHandler = new SocketsHttpHandler
{
PooledConnectionIdleTimeout = TimeSpan.FromHours(27),//Actually 5 mins can be idle at maximum. Note that timeouts longer than the TCP timeout may be ignored if no keep-alive TCP message is set at the transport level.
MaxConnectionsPerServer = 10
};
client = new HttpClient(socketsHandler);
如您所见,虽然我将空闲超时设置为 27 小时,但实际上它只保持 5 分钟的事件时间。所以,最后我只是每 1 分钟使用相同的 HttpClient 调用目标端点。在这种情况下,始终存在已建立的连接。您可以使用 netstat 来检查。它工作正常。
关于c# - .NET HttpClient GET 请求在空闲约 100 秒后非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40898598/