0

アクション応答として、名前を持つ Person などの POJO をシリアル化する axis2 (Java) で公開された SOAP Web サービスがあります。さらに、バイナリ添付ファイルを使用して応答に入れるためにシリアル化された DataHandler を使用するアクションがあります<xop:Include ...></xop:Include>

wso2 wsfcpp が提供する wsdl2cpp を使用して、c++ でクライアント側コードを生成しました。getPerson(personId) アクションは正常に機能し、結果は期待どおりです。ただし、生成されたコードは正しく動作していないように見えますが、getFile(someId) アクションは成功しています。

サービスは、クライアントと同様に axis2.xml で enableMTOM=true に設定されます。クライアント側のメインに確実に Options.setEnableMTOM(true) を追加しました。

getFile(someId) 応答のエンベロープが有効であるため、問題は wsdl から生成されるコードにあると思います (そして、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 クライアント コード生成を伴う SOAP) が wsfcpp によって実装されていませんか?

前もって感謝します!

4

1 に答える 1

1

gSoap で同じことを試しましたが、同じ問題がありました。axis2 は、バイナリが最適化されているかどうかを自動的に検出すると考えました。また、どちらの場合も、wsdl によって公開される戻り要素の型は type="xs:base64Binary" であることがわかりました。

私が見つけた唯一の回避策は、xs:base64Binary を xop:Include に置き換えて、python (またはその他の) スクリプトを使用して WSDL にパッチを適用し、コードを生成することでした。

これで問題は解決しましたが、保守性の問題が生じます。

于 2012-07-19T17:55:55.600 に答える