.NET HttpClient在空闲约100秒后的GET请求非常缓慢

4
第一次请求或者空闲约100秒后的请求速度非常缓慢,需要15-30秒。任何非空闲请求都只需要不到一秒钟。我可以接受第一次请求需要时间,但是不希望小的空闲时间导致减速。 这种减速并不仅限于客户端,如果我在一个客户端上不断发出请求,那么另一个客户端的响应速度仍然很快。只有当所有客户端都空闲了100秒后,才会出现减速现象。 以下是我尝试过的一些更改: - 将HttpClient设置为单例,并且不使用using()块进行释放。 - 将ServicePointManager.MaxServicePointIdleTime设置为更高的值,因为默认值为100秒。由于时间段与我的相同,所以我认为这可能是问题所在,但它没有解决问题。 - 设置更高的ServicePointManager.DefaultConnectionLimit。 - 通过web.config设置默认代理设置。 - 使用await而不是httpClient.SendAsync(request).Result。 这与IIS应用程序池回收无关,因为默认设置为20分钟,其余应用程序仍然很快。 这些请求是发送到一个Web服务,该服务与AWS S3通信以获取文件。我已经失去了思路,所有的研究都指向了我已经尝试过的上述点。如果您有任何想法,将不胜感激! 以下是方法:
//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
你有代码示例可以提供给我们更多关于你正在处理的内容吗? - Cameron
已更新原帖以添加代码。 - Zertuk
1个回答

0

默认的空闲超时时间约为1-2分钟。在此之后,客户端必须重新与服务器握手。因此,您会发现在100秒后速度会变慢。

您可以使用套接字处理程序来延长空闲超时时间。

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来检查。它运行良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,