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

Python调用SOAP接口偶发TimeoutError 10060连接终止问题求助

问题分析与解决方案

可能的原因

  • 网络链路丢包:服务器虽及时返回响应,但数据包在传输到客户端的过程中丢失,导致客户端持续等待触发超时。这类情况多由中间路由、运营商网络波动引发,结合问题近期才出现的特征,大概率是网络环境发生了变化。
  • TCP连接复用异常:客户端连接池中的失效连接未被及时清理,复用这类连接时,服务器已关闭对应连接,但客户端不知情,发送请求后无法收到响应进而触发超时。
  • 响应包被拦截:服务器返回的响应包可能被客户端侧或中间节点的防火墙、安全策略拦截,客户端无法接收,最终表现为连接超时错误。
  • SOAP响应传输异常:服务器虽声称返回了响应,但可能存在TCP包不完整、SOAP消息传输截断的情况,导致客户端无法正确解析,这类异常被封装为连接错误呈现。

解决方法

  • 添加重试机制:针对偶发的连接错误和超时,实现指数退避的重试逻辑,这类问题通常重试即可恢复。示例代码:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def create_retry_session():
    session = requests.Session()
    retry_strategy = Retry(
        total=3,
        backoff_factor=1,
        status_forcelist=[429, 500, 502, 503, 504],
        allowed_methods=["POST"]
    )
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session.mount("https://", adapter)
    session.mount("http://", adapter)
    return session

def fire_request(session, headers, payload):
    try:
        res = session.request("POST", "https://url/SOAP.aspx", data=payload.strip(), headers=headers, timeout=20)
        res.raise_for_status()
        return res.content
    except requests.exceptions.ConnectionError as e:
        # 可添加日志记录异常信息
        raise
  • 禁用连接复用:若为失效连接复用导致的问题,可关闭连接复用,每次请求新建连接:
session = requests.Session()
session.keep_alive = False
  • 排查网络安全策略:检查客户端VPS的防火墙、安全组规则,以及中间网络节点的安全策略,确保服务器返回的响应包能正常抵达客户端。
  • 抓包定位问题:使用tcpdump或Wireshark抓包,当错误出现时分析数据包,确认是响应包丢失、截断还是其他网络环节故障。
  • 调整TCP连接参数:通过设置TCP保活机制检测失效连接,避免复用无效连接:
import socket
from requests.adapters import HTTPAdapter
from urllib3.connection import HTTPConnection

class KeepAliveAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        kwargs['socket_options'] = HTTPConnection.default_socket_options + [
            (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
            (socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60),
            (socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 10),
            (socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 3)
        ]
        super().init_poolmanager(*args, **kwargs)

# 应用自定义Adapter
session = requests.Session()
session.mount("https://", KeepAliveAdapter())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:42:49