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

时间:2016-11-30 21:31:34

标签: c# .net amazon-web-services amazon-s3 dotnet-httpclient

第一次请求或怠速大约100秒后的请求非常慢,需要15-30秒。没有空转的任何请求只需不到一秒钟。我对第一个请求花时间没问题,只是没有导致减速的小空闲时间。

对于客户端来说,减速并不是唯一的,如果我继续在一个客户端上发出请求,那么它会在另一个客户端上保持快速。只有当所有人都空闲100秒时才会减速。

以下是我尝试过的一些更改:

  • HttpClient 设置为单例并且不使用using()块处理它
  • ServicePointManager.MaxServicePointIdleTime 设置为更高的值,因为默认情况下为100秒。由于时间段与我的相同,我认为这是问题,但它没有解决它。
  • 设置更高的 ServicePointManager.DefaultConnectionLimit
  • 通过web.config设置的默认代理设置
  • 使用等待而不是 httpClient.SendAsync(request).Result

它与IIS应用程序池回收无关,因为默认设置为20mn,应用程序的其余部分仍然很快。

请求是指与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 个答案:

答案 0 :(得分:0)

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

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

{{1}}

如您所见,尽管我将空闲超时设置为27小时,但实际上它只保留5分钟。

因此,最后,我仅每1分钟使用相同的HttpClient调用目标端点。在这种情况下,始终存在已建立的连接。您可以使用netstat进行检查。很好。