VBA调用UPS API超时,需捕获SEND阶段错误求解决方案
UPS API迁移至Windows Server 2019后偶发超时问题解决方案
问题背景
原Windows Server 2012R2环境下UPS API运行正常,迁移至Windows Server 2019通过任务计划执行时,调用API或获取Token达到一定次数后会偶发操作超时错误,错误触发在MSXML2.ServerXMLHTTP对象的send步骤,重试可恢复,但原有On Error语句无法捕获该错误。已排除API调用频次超限问题,且尝试过以Windows Server 2008R2模式运行任务计划,问题仍存在。
可能原因及解决步骤
1. 强制指定TLS协议版本
Windows Server 2019默认TLS配置与2012R2存在差异,UPS API可能要求使用TLS 1.2及以上版本,而旧版MSXML2.ServerXMLHTTP可能未自动启用。在send前添加TLS版本强制配置:
- 使用
SetOption 2, 131072指定启用TLS 1.2(对应数值:TLS1.0=1048576,TLS1.1=524288,TLS1.2=131072)
2. 修复错误捕获逻辑
原有错误捕获仅覆盖send瞬间,未捕获运行时错误。需扩展错误捕获范围,记录错误编号及描述,避免仅依赖status判断:
- 在
send前后记录Err.Number和Err.Description,优先判断是否存在运行时错误
3. 优化对象释放与连接池管理
多次调用后未释放MSXML2.ServerXMLHTTP对象可能导致连接池耗尽,引发超时。每次请求完成后需显式释放对象:
- 使用
Set xmlHttp = Nothing销毁对象,释放占用的连接资源
4. 调整任务计划权限配置
Windows Server 2019的UAC及网络权限控制更严格,需确保任务计划运行账户具备足够权限:
- 勾选「不管用户是否登录都运行」
- 启用「使用最高权限运行」
- 确认运行账户有网络访问权限(如可正常访问UPS API域名)
5. 使用高版本MSXML2组件
旧版MSXML2.ServerXMLHTTP在Server 2019存在兼容性问题,改用MSXML2.ServerXMLHTTP.6.0版本:
- 替换
CreateObject("MSXML2.ServerXMLHTTP")为CreateObject("MSXML2.ServerXMLHTTP.6.0")
修改后的代码示例
Dim xmlHttp, errNum, errDesc Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") With xmlHttp .Open "GET", "https://onlinetools.ups.com/api/track/v1/details/...", False ' 强制启用TLS 1.2 .SetOption 2, 131072 .setRequestHeader "Authorization", "Bearer " & strClientToken .setRequestHeader "test", "string" .setRequestHeader "trans", "testing" On Error Resume Next .send errNum = Err.Number errDesc = Err.Description On Error GoTo 0 ' 优先判断运行时错误(如超时) If errNum <> 0 Then ' 可添加重试逻辑,比如限制重试次数 WScript.Echo "请求错误: " & errDesc GoTo RetryLogic End If If .status = 200 Then ' 处理返回数据逻辑 Else GoTo CheckConnection End If End With ' 显式释放对象 Set xmlHttp = Nothing RetryLogic: ' 实现自定义重试逻辑,比如延迟后重新执行请求
内容的提问来源于stack exchange,提问作者Ron2020
相关产品推荐
相关产品推荐

