WSO2 ESB 7.1.0二进制响应被截断为375B问题如何解决
截断原因
你遇到的375B固定截断来自WSO2底层Axiom XML解析器的默认单文本节点长度限制,当你把大段BASE64直接作为文本节点写入payloadFactory的XML结构中时,超出长度的部分会被解析器直接截断,转成二进制后刚好对应375B的有效内容。这个阈值是可配置的。
解决步骤
1. 调整XML节点长度限制
在WSO2 ESB安装目录下的conf/axis2/axis2.xml配置文件中添加如下参数,调整单文本节点最大长度(示例为10MB,可按需调整):
<parameter name="org.apache.axiom.om.maxTextNodeSize">10485760</parameter>
修改后重启服务生效。
2. 优化二进制响应构造逻辑
你原有的序列存在两个问题:一是直接把BASE64硬编码到payloadFactory的format标签中容易触发XML节点截断,二是没有显式设置Content-Length头,关闭分块传输后传输层会按默认缓冲区大小截断内容。
优化后的序列示例如下:
<!-- 先将BASE64内容存入上下文属性,避免XML节点截断 --> <property name="pdfBase64" scope="default" type="STRING" value="你的实际PDF文件BASE64编码"/> <payloadFactory description="构建二进制负载" media-type="xml"> <format> <ns:binary xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:binary> </format> <args> <arg expression="$ctx:pdfBase64"/> </args> </payloadFactory> <script language="js"><![CDATA[ var binaryNode = mc.getEnvelope().getBody().getFirstElement().getFirstOMChild(); binaryNode.setBinary(true); ]]></script> <!-- 配置传输属性 --> <property name="TRANSPORT_HEADERS" scope="axis2" action="remove"/> <property name="DISABLE_CHUNKING" scope="axis2" type="STRING" value="true"/> <property name="messageType" scope="axis2" type="STRING" value="application/octet-stream"/> <property name="ContentType" scope="axis2" type="STRING" value="application/pdf"/> <!-- 显式计算并设置Content-Length,避免传输截断 --> <property name="Content-Length" scope="transport" expression="fn:string-length(base64Decode($ctx:pdfBase64))"/> <header name="Content-Disposition" scope="transport" value="attachment; filename="raport.pdf""/>
3. 调整消息格式化器配置
将application/pdf对应的格式化器替换为BinaryFormatter,稳定性优于ExpandingMessageFormatter,修改conf/axis2/axis2.xml中的messageFormatters配置:
<messageFormatter contentType="application/pdf" class="org.apache.axis2.format.BinaryFormatter"/>
如果需要兼容其他二进制格式,可保留application/octet-stream对应的ExpandingMessageFormatter配置。
内容的提问来源于stack exchange,提问作者Marcin Orliński
相关产品推荐
相关产品推荐

