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
相关产品推荐
相关产品推荐

