0

我有一个使用axis2(Java)公开的soap Web服务,它将POJO序列化,例如具有名称的Person等,作为动作响应。此外,我有一个动作,它使用了一个序列化的 DataHandler,以便将二进制附件放入响应中,使用<xop:Include ...></xop:Include>

我已经使用 wso2 wsfcpp 提供的 wsdl2cpp 在 c++ 中生成了客户端代码。getPerson(personId) 操作工作正常,结果符合预期。但是,尽管生成的代码似乎无法正常工作,但 getFile(someId) 操作是成功的。

在axis2.xml 以及客户端中设置为enableMTOM=true 的服务。我什至添加了 Options.setEnableMTOM(true) 以确保在客户端的主要部分。

我认为问题在于从 wsdl 生成的代码,因为 getFile(someId) 响应的信封是有效的(我已经使用axis2c api手动测试了它,我可以按预期检索文件)。

以下是响应的 wsdl(从 axis2 Java 生成)中包含的模式:

<xs:element name="getFileResponse">
   <xs:complexType>
      <xs:sequence>
         <xs:element minOccurs="0" name="return" nillable="true" type="xs:base64Binary"/>
      </xs:sequence>
   </xs:complexType>
</xs:element>

这是用于生成客户端代码的命令行:

WSDL2CPP -uri MyService.xml -g -d adb -u -f

这是从服务收到的响应:

<ns:getFileResponse xmlns:ns="http://services.myplace.com">
   <ns:return>
      <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:1.3ad8fc0571509f196559ee5312c14d23250854e4c9c8383e@apache.org"></xop:Include>
   </ns:return>
</ns:getFileResponse>

wsdl 中是否缺少某些内容,或者该功能(带有 MTOM 客户端代码生成的肥皂)是否由 wsfcpp 实现?

提前致谢!

4

1 回答 1

1

我用 gSoap 尝试过同样的事情,但我遇到了同样的问题。我认为axis2会自动检测二进制文件是否经过优化。另外,我发现无论哪种情况,wsdl 公开的返回元素类型都是 type="xs:base64Binary"。

我发现的唯一解决方法是通过用 xop:Include 替换 xs:base64Binary 来修补 WSDL,使用 python(或其他)脚本,然后生成代码。

这解决了问题,但产生了可维护性问题。

于 2012-07-19T17:55:55.600 回答