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

TidHTTPServer触发异常时连接泄漏 调用Disconnect未生效问题咨询

TidHTTPServer SSL连接异常导致连接泄漏解决方案
  • 修改异常处理中的断连逻辑
    你当前在OnException事件中调用的AContext.Connection.Disconnect;默认是优雅断连,会等待待发送数据传输完成再释放资源,SSL握手失败的场景下没有待发送数据,会导致断连超时,Context长期留在上下文列表中。将断连代码改为强制立即断连即可:
AContext.Connection.Disconnect(True);

参数True表示直接关闭套接字,忽略所有待处理操作,立即触发资源释放。建议补充OnDisconnect事件的日志,确认异常连接是否正常触发了断开事件,方便排查问题。

  • 定期清理僵死上下文
    可以新增定时任务(如TTimer间隔30秒触发),遍历上下文列表主动清理未激活的连接,避免泄漏累积:
procedure TMain.CleanupStaleConnections;
var
  CtxList: TList;
  i: Integer;
  Ctx: TIdContext;
begin
  CtxList := WebService.Contexts.LockList;
  try
    for i := CtxList.Count - 1 downto 0 do
    begin
      Ctx := TIdContext(CtxList[i]);
      if not Ctx.Connection.Connected then
      begin
        Ctx.Connection.Disconnect(True);
        CtxList.Delete(i);
        Ctx.Free;
      end;
    end;
  finally
    WebService.Contexts.UnlockList;
  end;
end;
  • 调整组件超时参数
    给TidHTTPServer配置合理的超时阈值,避免半开连接长期占用资源:
    • ConnectTimeout设置为5000(单位毫秒,即握手超时5秒)
    • ReadTimeout设置为30000(读超时30秒)
      如果使用的是Indy 10的旧版本,建议升级到最新稳定版,该SSL握手异常导致的上下文泄漏问题已有官方修复。
  • 特定异常直接清理
    你遇到的Error accepting connection with SSL. EOF was observed that violates the protocol异常属于客户端握手阶段主动断开的场景,捕获到该异常时可以直接将对应上下文从列表中移除,无需等待自动释放。

内容的提问来源于stack exchange,提问作者Wolfgang Bures

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 21:48:00