2009-07-30 17 views
2

WCF service return valuesについての私の他の投稿によると、私は別の会社のWebサービスを消費しています。そして、Visual Studio内でサービス参照を追加すると、のメソッドは、タイプobjectのオブジェクトです。WCFサービスが "オブジェクト"型のオブジェクトを返す原因

Webサービスの作成者が私にコードを示し、実際に型付きオブジェクトを返します。

何か不足していますか、またはプロキシクラスが型付きの値を返すと思われますか?

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

UPDATE:私は、WCFサービスの背後にある実際のクラスを見て、サービスメソッドの戻り値が実際に、その具体的なタイプの実装をインタフェースを返していることに気づい

。具体的な型は[DataContract]属性(および適切な[DataMember]属性)でマークされていますが、そのような属性はありません。これは、サービスが戻り値の型をオブジェクトとして設定する原因になりますか?

+0

私の更新情報はありますか? –

+0

まだいくつかのコードを表示する必要があります。サービス契約の操作の署名を表示します。 –

+0

応答していない理由はありますか? –

答えて

4

仮に、あなたがKnownTypeAttributeを使用することができます。

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

[DataContract] 
public class MyConcreteClass : IMyInterface { 
} 

私は個人的にインターフェイスでこれを試していないが、私は抽象基底クラスでそれを試してみましたが、それは動作します良い。クライアントが戻り値を受け取ると、派生クラスに正常にダウンキャストできます。

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

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

1

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

Visual Studioの "Add Service Reference"ツールとsvcutil.exeは、プロキシクラスを生成するのに非常に優れていますが、完全ではありません。生成するファイルは変更するファイルであり、適切なデータコントラクトを返すように操作を単純に変更することをお勧めします。あなたは、サービスの開発者であれば

+0

自動生成されたプロキシクラスを手動で変更してサービスを更新すると、変更が正しく上書きされますか? –

+0

プロキシクラスが部分クラスであるようです。だから私はそのように変更することができます。 –

+0

これを部分クラスで変更することはできません。プロキシ自体を変更する必要があります。テストなしでは、サービス更新があなたの変更を上書きするかどうかはっきりとは言えませんが、修正するのは簡単ではなく、容易に発見できるコンパイルエラーになります。 –

1

WCFからJava Webサービスを使用するときも同様の問題がありました。

私たちのケースでは、戻ってきたタイプは、実際に返されたものの限定バージョンでした。

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

したがって、問題を解決するには、予想されるタイプにオブジェクトをキャストしようとする可能性があります。

関連する問題