c# - .NET HttpClient GET 请求在空闲约 100 秒后非常慢

标签 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 应用程序池回收无关,因为默认设置为 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/

    相关文章:

    c# - TextBox 不按代码 C# 顺序显示初始文本

    c# - 即使连接已关闭,MySql 也会执行 MySqlScript

    c# - 如何使用另一个程序集的内部类

    c# - 分组相同类型的集合 C#

    amazon-web-services - Fn::Sub 在文字 block 中使用 Mapping 来指定用户数据脚本

    c# - 如何使用 CultureInfo 格式化已弃用的货币?

    c# - 用 '<b>' 将字符串中的单词包裹起来使其成为粗体而不改变单词的原始大小写

    amazon-web-services - SSL证书在laravel项目aws中不起作用

    c# - WCF WSHttpBinding SOAP 安全协商失败

    amazon-web-services - AWS Lambda 控制台 - 升级 boto3 版本