10

私は、Java で書かれた Web サービスを呼び出す C# クライアントを作成しています (別の人が作成しました)。クライアントに Web 参照を追加し、Web サービスのメソッドを正常に呼び出すことができました。

オブジェクトの配列を返すようにサービスが変更されましたが、クライアントは返された SOAP メッセージを適切に解析しません。

MyResponse[] MyFunc(string p)

class MyResponse
{
    long id;
    string reason;
}

生成された C# プロキシが (SoapHttpClientProtocol.Invoke を使用して) Web サービスを呼び出すとき、長さ 1 の MyResponse[] 配列、つまり単一の要素が必要です。Invoke 呼び出しの後に得られるのは、サービスが実際に返すものに関係なく、id=0 および reason=null の要素です。パケット スニファーを使用すると、サービスが、id と理由が null 以外の値に設定された正規の SOAP メッセージのように見えるものを返していることがわかります。

C# クライアントが someobject[] を返す Java Web サービスを呼び出せるようにするためのトリックはありますか? 必要に応じて、サニタイズされたデモの入手に取り組みます。

編集: これは、「Web 参照の追加...」による Web 参照です。VS 2005、.NET 3.0。

4

3 に答える 3

8

Xian のおかげで、解決策が見つかりました。

サービスの wsdl には次の行が含まれていました

<import namespace="http://mynamespace.company.com"/>

クライアントがサーバーに送信した SOAP には、すべてのデータ要素に次の属性がありました。

xmlns="http://mynamespace.company.com"

しかし、(サービスからクライアントへの) 応答の xml ペイロードには、この名前空間が含まれていませんでした。HTTP 応答 (WireShark で取得)をいじってみると、返されたデータ要素ごとに xmlns 属性を強制すると、.NET プロキシ クラスが MyResponse 値を正しく取得することがわかりました。

私が制御していないサービスを変更する以外の回避策は、VS で生成されたプロキシ クラス (たとえば、Reference.cs) を編集し、次のような行を探すことです。

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mynamespace.company.com")]
public partial class MyResponse {

XmlType 属性行をコメントアウトします。これにより、wsdl で指定された名前空間ではなく、デフォルトの名前空間で応答要素を探すように CLR に指示されます。参照を更新するたびにこれをやり直す必要がありますが、少なくとも機能します。

于 2008-09-15T20:51:50.737 に答える
3

かなり時間が経ちましたが、.Net Web サービスと Java Web サービスの間でデフォルトの名前空間がどのように処理されるかのわずかな違いに苦労したことを覚えているようです。

生成された c# プロキシ クラスと、その中で宣言されている名前空間 (特にデフォルトの xmlns="") を、Java サービスが予期しているものと照合して再確認します。おそらく非常に微妙な違いがあり、それを再現する必要があります。

この場合は、c# 属性でさらに名前空間宣言を提供する必要があります。

于 2008-09-15T17:27:10.793 に答える
0

あなたの質問から、ある時点でクライアントが機能していたように見えますが、その後、配列を返すようにサービスが変更されました。返された SOAP メッセージがクライアントで逆シリアル化されるように、必ずプロキシを再生成してください。あなたがこれをしたかどうかは明らかではありませんでした - 確認するだけです。

于 2008-09-15T19:57:03.570 に答える