3

WCFサービスの戻り値に関する他の投稿によると、私は別の会社のWebサービスを利用しており、Visual Studio内にサービス参照を追加すると、メソッドの戻り値はタイプのオブジェクトになりますobject

Webサービスの作成者がコードを見せてくれましたが、実際には型付きオブジェクトが返されます。

何かが足りないのですか、それともプロキシクラスが型付きの値を返すことになっていますか?

プロキシクラスまたは実際のサービスを生成するための設定はありますか?

アップデート:

WCFサービスの背後にある実際のクラスを調べたところ、サービスメソッドの戻り値は、具象型が実装するインターフェイスを実際に返していることがわかりました。具象型は[DataContract]属性(および適切な[DataMember]属性)でマークされていますが、インターフェースにはそのような属性はありません。これにより、サービスがリターンタイプをオブジェクトとして設定している可能性がありますか?

4

3 に答える 3

5

仮に、あなたがサービス開発者であれば、KnownTypeAttribute:を使用できます。

[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}

[DataContract]
public class MyConcreteClass : IMyInterface {
}

私はこれをインターフェイスで個人的に試したことはありませんが、抽象基本クラスで試したので、問題なく動作します。クライアントが戻り値を受け取ると、派生クラスに正常にダウンキャストできます。

サービスコードが実際にこれを行っている可能性があり、問題はsvcutil.exeプロキシクラスを十分に正確に生成していないことにあります。

サービスコードは制御しませんが、クライアントプロキシコードは制御します。svcutil.exe自分で追加できるプロキシクラスを手動で編集してみることができKnownTypeAttributeます。これを行うことで、最後にDataContractSerializerの動作を制御し、誤ってデータの配線形式を変更しないように注意する限り、すべてが機能するはずです。

于 2009-08-05T16:12:56.730 に答える
1

プロキシクラスは生成されたファイルであるため、間違いが含まれている可能性があります。データコントラクトのコピーがある場合は、プロキシクラスを自由に変更して、正しいタイプを使用するのではなく、System.Object正しく機能するはずです。

Visual Studioの「サービス参照の追加」ツールsvcutil.exeはプロキシクラスの生成に非常に優れていますが、完全ではありません。それらが生成するファイルは変更する必要があります。適切なデータコントラクトを返すように操作を変更することをお勧めします。

于 2009-07-30T12:55:18.560 に答える
1

WCFからJavaWebサービスを使用する場合にも、同様の問題が発生しました。

私たちの場合、それが戻ってきたと言ったタイプは、実際に返されたものの限定バージョンでした。

私たちのために働いたのは、オブジェクトを期待されたタイプにキャストすることでした。その後、データが利用可能になりました。

したがって、問題を修正するには、オブジェクトを予期されたタイプにキャストしてみてください。

于 2009-08-09T17:51:20.097 に答える