0

プロジェクトの場合、WCF サービスを使用する必要があります (私が作成したものではありません)。
gSoap ツールキットを使用して適切なクラスを作成したところ、すべてうまく機能していました。

それは、サービスの開発者がサービスを更新して WS-Addressing を要求することを決定するまでのことでした!

soapUI ツールを使用してサービスをテストしました。応答を得るには、WS-A の下の「デフォルトの wsa:To を追加」オプションをチェックする必要があります。

私のコードで同様のことをする必要があると思います。wsa プラグインの使用について読みましたが、十分な手順が見つかりませんでした。私がこれまでに行ったことは次のとおりです。

使ったwsdl2h -o outfile.h url_to_service -t typemap.dat

typemap.dat に次のように記述します。

SOAP_ENV__Header =\
#import "wsa.h"\n\
struct SOAP_ENV__Header\n\
{\n\
    mustUnderstand _wsa__MessageID    wsa__MessageID 0;\n\
    mustUnderstand _wsa__RelatesTo *  wsa__RelatesTo 0;\n\
    mustUnderstand _wsa__From *       wsa__From      0;\n\
    mustUnderstand _wsa__ReplyTo *    wsa__ReplyTo   0;\n\
    mustUnderstand _wsa__FaultTo *    wsa__FaultTo   0;\n\
    mustUnderstand _wsa__To           wsa__To        0;\n\
    mustUnderstand _wsa__Action       wsa__Action    0;\n\
};

soapcpp2 ツールを使用すると、次のようなエラーが表示されます。

wsa5.h(288):エラー: リモート メソッド名の衝突: 構造体/クラス 'SOAP_ENV__Fault' は 274 行目で既に宣言されています

最後に、コードからサービス メソッドを呼び出そうとすると (C++、以前のバージョンから何も変更せず、WS-A は必要ありませんでした)、プログラムがフリーズし、使用メモリがある程度 (~700MB) 増加することがわかります。 、次にドロップすると、プログラムはフリーズしたままになります!

Windows、VS2010、および gSoap 2.8.17 を使用しています。
WSA を追加する方法について、誰かが正しい方向に向けることができますか?

前もって感謝します!

4

1 に答える 1

0

WS-Addressing のいくつかのリリースを混在させていると思います:

gSOAP typemap.datでは、次のことがわかります。

wsa = <http://schemas.xmlsoap.org/ws/2004/08/addressing>
wsa3 = <http://schemas.xmlsoap.org/ws/2003/03/addressing>
wsa4 = <http://schemas.xmlsoap.org/ws/2004/03/addressing>
wsa5 = <http://www.w3.org/2005/08/addressing>

WS-Addressing ヘッダーが wsdl で定義されている場合、その定義は typemap.dat でのカスタム ヘッダー定義なしで行われます。SOAP_ENV__Header 定義を削除し、wsa プラグインによって管理される wsa 名前空間の定義を追加する必要があると思います (存在しない場合)。

gSOAP のドキュメントdoc/wsa/html/index.htmlおよび wsa プラグインのサンプルsamples/wsa/wsademo.cから、wsa プラグインの使用に関する情報を見つけることができます。

gSOAP プラグインがソース ファイルとして提供されていることに注意してください。そのため、plugin/wsaapi.c ファイルをコンパイルしてリンクする必要があります。

于 2014-05-31T15:03:10.243 に答える