8

現在、Java B2B Webサービスのクライアントを構築することをやめていますが、かなり長い間抱えていた問題の原因を特定できたと思います。残念ながら、WSDLを投稿できません。

どうやら私の自動生成されたプロキシコード(wsdl.exe経由:パスワードダイジェストをサポートしていないWCFのためにWSE 3.0を使用する必要があります)は、同じ複雑なリターンタイプを持つ複数のWebメソッドを持つWebサービスのWSDLを処理できません。

たとえば、次のメソッドを定義するWebサービスを考えてみましょう。

Public ComplexTypeX Blah();
Public ComplexTypeX Blue();
Public ComplexTypeX Foo();
Public ComplexTypeY Bar();

Reference.csファイルで、Blah()、Blue()、またはFoo()のいずれか2つを呼び出すすべてのコードをコメントアウトすると、コメントされていない残りのメソッドを問題なく呼び出すことができます。ただし、コメントアウトされていないこれらの3つのメソッド(たとえば、Blah()およびFoo())が複数ある場合、Webサービスクライアントコードのインスタンス化時に次のエラーメッセージが表示されます。

「メソッドBlahは反映できません。」「名前空間' http://some.url 'のXML要素'ComplexTypeX'は、メソッドとタイプを参照します。WebMethodAttributeを使用してメソッドのメッセージ名を変更するか、XmlRootAttributeを使用してタイプのルート要素を変更してください。」

現在、ComplexTypeXWebサービスの一部として定義されているメソッドは絶対にないため、.NET(または少なくともwsdl.exe)では、複雑な(ユーザー定義の)Webサービスを使用できないと想定できます。複数のメソッドにまたがる同じタイプのタイプ...そうですか?

4

6 に答える 6

8

同様の問題に遭遇しましたが、ここに私が見つけたものがあります:

応答として返す複合型を定義しました。

public class FooResponse {...}

[WebMethod]
public FooResponse Foo() {...}

ここでは、Foo/Foo+Response の正確な名前の組み合わせが重要であることに注意してください。メソッド名を次のように変更すると、問題はなくなりました。

public class FooResponse {...}

[WebMethod]
public FooResponse Fooxxx() {...}

私が信じているのは、.NET が Foo メソッドからの応答を FooResponse という名前の要素で自動的にラップしようとしているということです。返したいオブジェクトと同じ名前を使用すると、あいまいさが生じます。この競合を避けるために、応答オブジェクトの名前またはメソッドの名前を変更してみてください。

于 2010-07-02T20:33:41.847 に答える
3

「メソッドとタイプを参照する」を検索したところ、Connectのバグレポート「System.InvalidOperationException:名前空間からのXML要素*がメソッドとタイプを参照する」を見つけました。この場合、まったく同じ名前(ローカル名と名前空間の両方)の操作と要素があります。


Microsoftからの回答の一部に注目する価値があります。

ASMXの機能強化はもう行っていません。既存の機能は引き続きサポートしますが、可能であれば、代わりにWCFを使用することをお勧めします。

于 2009-07-22T12:21:58.380 に答える
1

エラーが発生する別のケースを見つけました! これが私のコードです:

[WebMethod]
public CheckUpdateResponse CheckUpdate()
{
...
}

わかりました、説明させてください。戻り値の型CheckUpdateResponseは構造体でCheckUpdate()あり、メソッドです。そのため、WSDL .NET では、メソッドの戻り値を記述するために、XML 要素の 1 つのメソッド名に " " サフィックスを自動的に追加します。ResponseCheckUpdate

Et voilà:重複する要素が見つかり、「WebMethodAttributeを使用してメソッドのメッセージ名を変更してください...」というエラーが表示されます

解決策? 戻り型の名前を「CheckUpdateResult」に変更したところ、すべてが正常に機能するようになりました!

これが誰かを助けることを願っています!

于 2012-11-27T19:22:38.283 に答える
0

そのため、.NET (または少なくとも wsdl.exe) では、複数のメソッドで同じ型の複雑な (ユーザー定義の) 型を返す Web サービスを使用できないとしか思えません。

これは正しくありません。もしそれが本当なら、どれだけの苦痛になるか想像してみてください - String を返すメソッド、Double を返すメソッド、SomeObject を返すメソッドなど、1 つのメソッドしか持つことができません。悪夢になるでしょう。

私は .NET の Web サービスにあまり詳しくありませんが、発生しているエラーからは、XML 名前空間に問題があるように思えます。おそらく名前の衝突があります。エラーメッセージの提案に従って、WebMethodAttribute.

また、会社のプライバシー/機密性の問題が原因で、発生している問題に関連するコード/ドキュメントを投稿できない場合は、テスト ケースを証明するサニタイズ バージョンを投稿する必要があります。ほとんどすべての「機密」は、機密性を裏切ることなく主張を理解できる、はるかに単純なコード スニペットに煮詰めることができるはずです。

于 2009-02-24T01:02:47.267 に答える
0

WSDL.exe にはスイッチ /sharetypes があります。これで問題は解決するはずです。

さらに、同じクラスが複数の wsdl にあるさまざまな複雑な型として公開されているため、Microsoft のことであることに同意しません。それは良い抽象化されたデザインではありません。

すぐに参照できる sharetypes の Microsoft ドキュメント タイプ共有機能をオンにします。この機能は、異なるサービス間で共有される同一の型の単一の型定義を持つ 1 つのコード ファイルを作成します (名前空間、名前、およびワイヤー署名は同一である必要があります)。コマンドライン パラメータとして http:// URL を使用してサービスを参照するか、ローカル ファイルの discomap ドキュメントを作成します。

于 2009-07-22T13:18:59.743 に答える
0

非常に奇妙な。通常、WSDL は共通の型を提供し、wsdl.exe または svcutil.exe を使用してコンパイルすると、同じインターフェイス内の任意の数のメソッドで使用できる共有の共通の型が得られます。

同じアプリで複数の独立したWSDL を参照すると、表向きは同一の型を共有し、結果として 2 つの異なる CLR 型が生成されるという問題がありました。この問題を回避する方法はいくつかあります。これはかなりよく知られています。次に、既存のビジネス オブジェクトを WSDL から生成された型にマッピングするという、やや関連した問題があります。別の以前に調査された風景。

しかし、あなたは何か違うことについて話している。

于 2009-02-24T05:53:10.487 に答える