2008-09-15 1 views
10

私はJavaで書かれたWebサービスを呼び出すC#クライアントを作成しています(他人によって)。クライアントへのWeb参照を追加しました。Webサービスでメソッドを呼び出すことができました。オブジェクトの配列を返すJava Webサービスを消費するC#クライアントを作成する

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

MyResponse[] MyFunc(string p) 

class MyResponse 
{ 
    long id; 
    string reason; 
} 

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

someobject []を返すJava WebサービスをC#クライアントに呼び出すにはいくつかのトリックがありますか?私は、必要に応じて消毒されたデモを手に入れます。

を編集してください:これは「Web参照の追加...」からのWeb参照です。 VS 2005、.NET 3.0。

+0

「Web参照の追加」(.NET 2.0)または「サービス参照の追加」(.NET 3.0)を使用していますか。 –

答えて

3

しばらくしていますが、.NETとJava Webサービスの間でデフォルトの名前空間がどのように処理されたかに若干の違いがあることを覚えているようです。

Javaサービスが期待しているものに対して、生成されたC#プロキシクラスとその中で宣言されている名前空間(特にデフォルトのxmlns = "")を再度確認してください。おそらく、あなたが作り直さなければならない非常に微妙な違いがあるでしょう。

この場合、c#属性でより多くの名前空間宣言を提供します。

0

あなたの質問から、クライアントがある時点で作業していて、サービスが配列を返すように変更されたように見えます。返されたSOAPメッセージがクライアント上で逆シリアル化されるように、プロキシを再生成するようにしてください。あなたがこれをやったことは明らかではありませんでした。

+0

ご理解の方が正しいです。 MyResponse []を返すメソッドを追加するまではうまくいった。私は参照をリフレッシュし、プロキシは再構築されました。 –

8

西安のおかげで、解決策があります。

ライン

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

サーバーに送信されたクライアントは、すべてのデータ要素に次の属性を持っていた石鹸含まれるサービスのWSDL:

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

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

私がコントロールしていないサービスを変更するのショートが、回避策はVSを編集することで、プロキシクラス(例えばReference.cs)を生成し、このような行を探します。

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

とコメントアウトXmlType属性の行。これにより、CLRはwsdlで指定されているレスポンス要素ではなく、デフォルトの名前空間でレスポンス要素を探すようになります。参照を更新するたびにこれをやり直さなければなりませんが、少なくともそれは機能します。

+0

あなたのソリューションを投稿してくれてありがとう、それは思い出の洪水をもたらしました! – Xian

関連する問題