现象:
原有两台WebLogic v6.1上面运行的WS应用,改成WebLogic v6.1作为服务提供方,WebSphere V6作为服务接收方后,在WebSphere接收到返回信息时,抛出错误:
00000032 SystemErr R WebServicesFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
faultString: org.xml.sax.SAXParseException: 内容中不得出现字符序列“]]>”,除非它用于标记 CDATA 部分的结尾。 Message being parsed: <?xml version='1.0' encoding='UTF-8'?><SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance' xmlns:xsd='http://www.w3.org/1999/XMLSchema'><SOAP-ENV:Body><ns0:unifiedCall20Response xmlns:ns0='urn:local' SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'><return xsi:type='xsd:string'><?xml version="1.0" encoding="GB2312"?>
<RESPONSE>
<ROUTE>
<VERSION>2.0</VERSION>
<OBJ_RANGE>01</OBJ_RANGE>
<RET_FLAG>Y</RET_FLAG>
</ROUTE>
<DISPATCHER>
<VERSION>2.0</VERSION>
</DISPATCHER>
<CONTENT>
<COMMAND>QUERY</COMMAND>
<RET_FORMAT>VN,CN,VL,CT</RET_FORMAT>
<DATA APPID="A001">
<STATE>1/1</STATE>
<R>
<PHOTO VN="PIC"><![CDATA[/9j/4AAQSkZJRgABAQAAAQABAAD/2wOckkZrL(以下略)
(以上略)orODSv3Sknd5i5JPrzWx9s8Qf8AQN/8fX/GqbZO/U//2Q==]]></PHOTO>
</R>
</DATA>
</CONTENT>
</RESPONSE>
</return></ns0:unifiedCall20Response></SOAP-ENV:Body></SOAP-ENV:Envelope>
faultActor: null
faultDetail:
原因:
究其原因,因为发送的XML中包含<CDATA>标签,而在发送前WebLogic将该段XML放入到SOAP时,该段XML的”<”全部被转义成”<”,但”>”却没有被转义,导致WebSphere在接收之后解析该段XML时就会抛出Exception。但如果该段XML不含有<CDATA>字样时不会有任何转义现象出现。
解决方案:
因为当时无法更换发送端的WebLogic服务器,而问题出现在那边,因此只好对发送出来的XML进行编码(如Base64),使发送时的内容不再是含有CDATA的XML,而只是一串特殊的字符串,以此“蒙骗”WebLogic进行SOAP打包时候的问题。WebSphere方接收后应用程序需要对该特殊字符串进行解码再做原有的XML解析。