24

WCF クライアントから SAP PI バスで Web サービスを呼び出すときに問題が発生しました。操作は一方向として定義されており、プロキシ操作コントラクトのメソッドは、サービス参照が追加されるとそれに応じて装飾されます。ただし、サービス クライアントは、対応する操作を呼び出すときに例外を取得します。

一方向の操作で、Action='' の null 以外のメッセージが返されました

SoapUI を使用すると、バス上のメソッドを正常に呼び出すことができ、ボディが空の SOAP エンベロープが返されます。バス関係者によると、これは SOAP 仕様によるものです。


(SOAP 仕様、4.7.9 章、一方向操作):

一方向の操作を実行するときに HTTP を使用する方法については、さまざまな解釈があります。

R2714一方向の操作の場合、インスタンスはエンベロープを含む HTTP 応答を返してはなりません。具体的には、HTTP 応答のエンティティ ボディは空にする必要があります。

R2750 コンシューマーは、一方向の操作で HTTP 応答メッセージで運ばれるエンベロープを無視する必要があります。

R2727一方向の操作の場合、CONSUMER は成功した HTTP 応答ステータス コード (つまり、2xx) を、メッセージが有効であること、または受信者がそれを処理することを意味するものとして解釈してはなりません (MUST NOT)。


私の WCF クライアントは R2750 に準拠していないようです。

プロキシの操作コントラクトを強制的にIsOneWay = falseにすると、すべてが機能することがわかりました。

WCF が一方向の操作を処理する方法に何か問題がありますか、それとも何か間違っていますか (可能性が高いですか)? 他にすべきことはありますか?生成された WCF プロキシ クライアントをオーバーライドするのは適切ではないようです。

提案をありがとう。

4

5 に答える 5

16

SAP PIが空のSOAPエンベロープを誤って送信し、.NETがそのエンベロープを誤って解釈しているようです。

このスレッドからのいくつかのオプション:

  • 生成されたプロキシを変更し、メソッド定義にOneWay = trueを削除(またはOneWay = falseを追加)します
  • 例外ハンドラでプロトコル違反をキャッチし、無視します
  • 2.0スタイルのWeb参照を使用してサービスを呼び出す
  • SAPパッチノート1459995-SoapSenderAdapter HTTP 202を適用し、URLに&responsecode202=trueを追加します

最初と最後のオプションは両方とも私のために働いた。このsap.comスレッドに関する詳細な説明。

于 2013-02-13T18:29:24.520 に答える
4

こちらのGerben van Loonの記事も参照してください。一方通行の操作は、標準によると、実際には一方通行ではない場合があります。

于 2010-12-19T17:10:38.130 に答える
0

メソッドのシグネチャがどのように見えるかを見ずに、私の推測では、メソッドが「void」以外のものを返すように定義されていると思います。操作は一方向であるため、メソッドは「void」を使用してのみ定義できます(戻り値はありません)。それ以外の場合、操作は一方向ではありません。

于 2011-05-31T18:52:46.607 に答える
0

この特定の問題は、クライアント プロキシの操作に次の属性宣言を追加することで解決できると思います。

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

于 2011-05-27T17:56:35.550 に答える