You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core应用使用Flurl调用API出现间歇性超时问题求助

排查Flurl调用.NET Core API周期性超时问题

错误信息

---> Flurl.Http.FlurlHttpTimeoutException: Call timed out: GET https://---.--.com:7000/api/Establecimiento/ExisteIdentificadorUnico/00074
---> System.Threading.Tasks.TaskCanceledException: The operation was canceled.
---> System.IO.IOException: Unable to read data from the transport connection: La operación de E/S se anuló por una salida de subproceso o por una solicitud de aplicación..
---> System.Net.Sockets.SocketException (995): La operación de E/S se anuló por una salida de subproceso o por una solicitud de aplicación.

已知信息

  • 客户端超时设置为12分钟
  • 网络连接稳定
  • 代码无明显逻辑问题
  • 重启客户端应用后恢复正常,一段时间后问题复发

排查与解决建议

1. 检查HTTP客户端连接池耗尽

Flurl默认复用HttpClient的连接池,同一个域名的默认最大并发连接数为2。若请求未正确释放连接,会导致连接池耗尽,新请求排队超时。

  • 排查:确认代码中是否重复创建FlurlClient实例,而非复用单例;检查是否在异常场景下未正确释放客户端资源。
  • 解决:通过依赖注入或FlurlClientFactory复用FlurlClient;使用using块确保请求完成后释放资源,避免长期持有客户端实例。

2. 排查API端线程池/请求队列阻塞

API端可能因线程池耗尽、同步阻塞代码导致请求积压,无法处理新请求。

  • 排查:在API端添加请求生命周期日志(记录请求进入、处理开始/结束时间);检查是否存在.Result/.Wait()等同步阻塞操作;监控API服务器的CPU、内存使用率。
  • 解决:API端全部使用异步代码;调整线程池最小线程数(ThreadPool.SetMinThreads);配置Kestrel的最大并发连接数(KestrelServerOptions.Limits.MaxConcurrentConnections)。

3. 检查TCP连接状态堆积

大量TCP连接处于TIME_WAIT状态未释放,会耗尽系统可用端口,导致新连接无法建立。

  • 排查:在客户端机器执行命令查看连接状态:
    • Windows:netstat -ano | findstr :7000
    • Linux:ss -tulpn | grep 7000
  • 解决:调整系统TCP参数缩短TIME_WAIT超时(Windows设置TcpTimedWaitDelay,Linux设置net.ipv4.tcp_tw_reuse=1);通过Flurl的WithKeepAlive(true)启用长连接,减少连接创建次数。

4. 验证Flurl超时配置有效性

全局超时配置可能被局部请求覆盖,导致实际超时时间远短于设置的12分钟。

  • 排查:检查代码中是否存在局部请求单独设置超时的逻辑;在请求前打印当前FlurlClient的超时值。
  • 解决:通过全局配置统一设置超时:
    FlurlHttp.Configure(settings => settings.Timeout = TimeSpan.FromMinutes(12));
    
    避免局部请求随意覆盖超时设置。

5. 排查API目标接口性能瓶颈

目标接口可能因数据库查询缓慢、外部依赖调用超时等导致响应延迟,周期性触发客户端超时。

  • 排查:给/api/Establecimiento/ExisteIdentificadorUnico接口添加详细日志,记录数据库查询耗时、内部方法执行时间;检查是否有定时任务在问题时段占用大量资源。
  • 解决:优化数据库查询(添加索引、优化SQL);异步执行耗时操作;监控服务器资源使用率,避免CPU/内存耗尽。

6. 自定义HttpClientHandler连接配置

Flurl底层的HttpClientHandler默认配置可能限制并发连接数,导致请求排队。

  • 解决:自定义HttpClientHandler并配置到FlurlClient:
    var handler = new HttpClientHandler
    {
        MaxConnectionsPerServer = 100, // 提高单域名最大连接数
        UseCookies = true,
        AllowAutoRedirect = true
    };
    var flurlClient = new FlurlClient(handler)
        .Configure(settings => settings.Timeout = TimeSpan.FromMinutes(12));
    

内容的提问来源于stack exchange,提问作者Julian Gr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:10:59