HTTPClient.Get返回12002超时错误,浏览器正常请求异常排查
问题场景
目标Host为https://api.ipify.org/的Delphi HTTP请求函数,代码如下:
TRespEx=record Resp:IHttpResponse; EError:String end; function CheckIp(UseProxy: Boolean = True; Host: String = ipcheck; ProxyHost: String = '127.0.0.1'; ProxyPort: Integer = 9090): TRespEx; var Cli: THttpClient; begin Cli := THTTPClient.Create; Cli.SecureProtocols := [THTTPSecureProtocol.SSL2, THTTPSecureProtocol.SSL3, THTTPSecureProtocol.TLS1, THTTPSecureProtocol.TLS11, THTTPSecureProtocol.TLS12, THTTPSecureProtocol.TLS13]; try try if UseProxy = True then Cli.ProxySettings.Create(ProxyHost, ProxyPort); Cli.SetUserAgent(PUserAgent); Result.Resp := Cli.Get(Host); except on E: Exception do Result.EError := E.Message; end; finally Cli.Free; end; end;
该函数原本在UseProxy=False(不使用代理)时运行正常,近期突然抛出超时异常:
Error sending data: (12002) The operation time out
已知条件:
- 未修改任何代码
UseProxy=True时函数仍可正常工作- 目标Host可通过浏览器正常访问
PUserAgent已复制自浏览器- 已关闭杀毒软件和防火墙
可能的原因及解决思路
1. 系统默认代理被静默配置
虽然代码指定UseProxy=False,但Windows系统可能被自动设置了全局代理(如软件后台配置、系统更新强制设置),导致THttpClient在无代码指定代理时仍尝试使用系统代理,而该代理不可用引发超时。
- 解决思路:
- 检查系统Internet选项中的代理设置,确认是否存在自动配置脚本或手动代理
- 当
UseProxy=False时,在代码中显式禁用系统代理:添加Cli.ProxySettings.Enabled := False;,避免THttpClient自动读取系统代理
2. THttpClient默认超时设置过短
THttpClient默认超时可能偏短,当网络环境波动(如目标服务器响应变慢、本地网络路由变化)时,无代理路径的请求触发超时,而代理路径可能有缓存或不同路由,响应速度更快。
- 解决思路:
- 显式设置更长的超时时间,例如
Cli.Timeout := 10000;(10秒),覆盖默认值 - 精细化控制超时:分别设置
Cli.ConnectionTimeout(连接超时)和Cli.ResponseTimeout(读取超时)
- 显式设置更长的超时时间,例如
3. 本地DNS解析异常
浏览器可能使用自定义DNS(如Chrome安全DNS),而THttpClient依赖系统默认DNS,当系统DNS无法正确解析api.ipify.org时,导致连接超时;代理服务器则使用了正常的DNS解析路径。
- 解决思路:
- 手动测试DNS解析:打开命令提示符执行
nslookup api.ipify.org,检查返回IP是否正常 - 直接使用目标Host的IP地址发起请求,验证是否为DNS问题
- 刷新系统DNS缓存:执行
ipconfig /flushdns
- 手动测试DNS解析:打开命令提示符执行
4. SSL/TLS协议兼容性问题
代码中启用了所有SSL/TLS协议,但目标服务器近期可能调整了支持的协议版本,无代理路径下的协议协商失败导致超时;代理可能自动适配了正确的协议版本。
- 解决思路:
- 简化SSL协议列表,仅保留主流TLS版本:
Cli.SecureProtocols := [THTTPSecureProtocol.TLS12, THTTPSecureProtocol.TLS13];,移除老旧的SSL2/SSL3/TLS1/TLS11 - 确认目标服务器支持的TLS版本,匹配代码中的协议设置
- 简化SSL协议列表,仅保留主流TLS版本:
5. 本地网络路由表异常
无代理请求的路由路径出现故障(如本地网关、ISP路由节点问题),而代理请求走了不同的路由路径(如代理服务器有独立出口线路)。
- 解决思路:
- 执行
tracert api.ipify.org(无代理时),查看路由跳转是否存在超时节点 - 切换网络环境(如手机热点),验证是否为当前网络的路由问题
- 执行
内容的提问来源于stack exchange,提问作者Bald
相关产品推荐
相关产品推荐

