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

OpenEdge通过SOAP API获取含非Base64格式附件数据时遇故障

解决SOAP API响应中二进制文件的读取问题

问题根源

你原来的代码用StreamReader读取响应流并存入LONGCHAR,这种方式仅适用于纯文本(如SOAP XML)场景。当响应包含未Base64编码的二进制文件(PDF、PNG等)时,StreamReader会尝试用文本编码解析原始字节,要么触发编码错误,要么破坏二进制数据结构导致文件损坏。LONGCHAR本质是文本类型,不适合存储二进制内容,应该用MEMPTR来处理二进制数据。

解决方案:用BinaryReader读取二进制流转MEMPTR

直接使用.NET的BinaryReader读取响应流的原始字节,再转换为Progress的MEMPTR类型,完整保留二进制数据:

DEFINE VARIABLE binReader AS System.IO.BinaryReader NO-UNDO.
DEFINE VARIABLE byteArray AS System.Byte[] NO-UNDO.
DEFINE VARIABLE memPtr AS MEMPTR NO-UNDO.
DEFINE VARIABLE responseStream AS System.IO.Stream NO-UNDO.

// 获取响应流
responseStream = response:GetResponseStream().
binReader = NEW System.IO.BinaryReader(responseStream).

// 读取所有字节到字节数组
byteArray = binReader:ReadBytes(responseStream:Length).

// 将字节数组转换为MEMPTR
SET-SIZE(memPtr) = byteArray:Length.
COPY-LOB FROM byteArray TO memPtr.

// 清理资源
binReader:Close().
response:Close().

说明

  • BinaryReader直接读取流的原始字节,不会对数据做任何编码转换,确保二进制内容完整。
  • MEMPTR是Progress专门用于存储二进制数据的类型,适合保存PDF、PNG等文件内容。
  • 如果响应是MIME多部分格式(同时包含XML和附件),后续还需要解析多部分内容分离出各个部分,但上述代码先解决了完整获取原始响应数据的核心问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:25:07