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

Delphi从10.2升级到10.4后Indy 10客户端请求出现10秒延迟问题

排查思路

  • 优先验证Indy版本差异:Delphi 10.2自带Indy 10版本为10.6.2.5366,10.4自带版本为10.6.2.5479以上,两个版本间存在多处HTTP读取、TLS关闭、连接复用逻辑的改动。你可以临时将项目引用的Indy单元路径替换为10.2环境下的旧版Indy源码编译测试,若延迟消失即可确认是Indy版本改动导致的问题。
  • 抓包验证TCP/TLS层行为:用Wireshark分别抓取两个版本环境下的请求通信包,重点核对三个点:
    • 响应头Content-Length字段值和实际返回的响应体字节数是否匹配
    • 10.4环境下收到完整响应数据后,是否存在TCP FIN等待超时,你遇到的10秒刚好是常见的TCP静默关闭默认超时阈值
    • 是否存在TLS会话关闭阶段的告警、重传,嵌入式设备常存在未按规范返回TLS关闭通知的情况
  • 核对TIdHTTP属性配置差异:
    • 检查是否开启了hoKeepOrigProtocol选项,10.4版Indy默认修改了HTTP协议版本降级逻辑,若Adyen设备返回HTTP/1.0响应且未携带Connection: keep-alive头,新版Indy会多等待10秒判断连接是否可复用
    • 检查SSLIOHandler的SSLShutdownTimeout配置,10.4版Indy修改了SSL关闭的调用逻辑,默认会等待对端返回TLS关闭通知,若设备直接断连会触发10秒超时

解决方案(按验证优先级排序)

  1. 强制HTTP/1.0协议:设置TIdHTTP.ProtocolVersion = pv1_0,默认不启用连接复用,跳过连接等待逻辑,可快速验证是否为连接复用导致的问题
  2. 缩短SSL关闭超时:给绑定的TIdSSLIOHandlerSocketOpenSSL组件设置SSLShutdownTimeout = 100,将等待TLS关闭通知的超时从默认10秒改为100毫秒,你已经拿到完整响应数据,该修改不会影响业务逻辑
  3. 禁用多余读取等待:给TIdHTTP.Options添加hoNoReadWait选项,跳过响应读取完成后的额外连接状态检查逻辑
  4. 替换Indy版本:若上述配置修改无效,可直接将项目依赖的Indy组件替换为10.2环境下的稳定版本,或升级到Indy官方最新源码,该类嵌入式HTTP设备通信的超时问题已在后续Indy更新中修复

内容的提问来源于stack exchange,提问作者Patrick Manion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 19:54:03