从远程 WSDL 构建 Zeep Client 时,可能会立即抓取该文档及其 import。应提前配置 Transport,而不是等 Client 已经尝试加载服务描述之后再设置代理。

from requests import Session
from zeep import Client
from zeep.transports import Transport

session = Session()
session.proxies.update({
    "http": "http://proxy.example.net:8080",
    "https": "http://proxy.example.net:8080",
})

transport = Transport(
    session=session,
    timeout=10,
    operation_timeout=30,
)
client = Client(wsdl_url, transport=transport)

wsdl_url 是服务描述的实际 URL。如果该服务及其 import 可公开访问,且允许使用公共代理,HTTP 代理列表可为会话的代理 URL 提供候选。让已配置的会话保持存活以用于后续 SOAP 操作,并在该工作结束时关闭它。

Transport.timeout 控制 WSDL 和 XSD 的加载。operation_timeout 控制为服务操作发出的 HTTP 请求。因此,在构建 Client 期间出现的元数据超时,与之后方法调用超时属于不同阶段。

在此示例中,Requests 的环境集成仍然有效。如果环境中的代理值与明确需要的路由冲突,请使用 session.trust_env=False,并显式提供所需的 CA 包和身份验证设置。

如果初始化仍然失败,请检查被导入文档的 URL。顶层 WSDL 可能加载成功,而导入的 schema 使用了其他主机名或目标协议。

相关文章