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

