WCFサービスが“ object”型のオブジェクトを返す原因は何ですか
-
05-07-2019 - |
質問
WCFサービスの戻り値、別の会社のWebサービスを使用しています。VisualStudio内にサービス参照を追加すると、メソッドの戻り値は object型のオブジェクトになります
。
Webサービスの作成者はコードを見せてくれ、実際に型付きオブジェクトを返します。
何かが足りないのか、プロキシクラスが型指定された値を返すのですか?
プロキシクラスまたは実際のサービスを生成するための設定はありますか?
更新:
WCFサービスの背後にある実際のクラスを見て、サービスメソッドの戻り値が実際にインターフェイスを返していること、具体的な型が実装していることに気付きました。具象型は[DataContract]属性(および適切な[DataMember]属性)でマークされていますが、インターフェイスにはそのような属性はありません。これにより、サービスが戻り値の型をオブジェクトとして設定する可能性がありますか?
解決
仮に、あなたがサービス開発者であれば、 KnownTypeAttribute
を使用できます:
[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}
[DataContract]
public class MyConcreteClass : IMyInterface {
}
私は個人的にインターフェイスでこれを試したことはありませんが、抽象基底クラスで試しましたが、うまくいきます。クライアントが戻り値を受信すると、派生クラスに正常にダウンキャストできます。
サービスコードが実際にこれを実行している可能性があり、問題は svcutil.exe
がプロキシクラスを十分に正確に生成していないことにあります。
サービスコードは制御しませんが、クライアントプロキシコードは制御します。 svcutil.exe
から提供されたプロキシクラスを手動で編集して、自分で KnownTypeAttribute
を追加することができます。これにより、最後にDataContractSerializerの動作を制御し、誤ってデータのワイヤ形式を変更しないように注意している限り、すべて正常に機能するはずです。
他のヒント
プロキシクラスは生成されたファイルであるため、間違いを含む可能性があります。データコントラクトのコピーがある場合は、 System.Object
ではなく正しいタイプを使用するようにプロキシクラスを自由に変更でき、物事は適切に動作するはずです。
Visual Studio"サービス参照の追加"ツールと svcutil.exe
はプロキシクラスの生成に非常に優れていますが、完璧ではありません。それらが生成するファイルは変更するものであり、適切なデータコントラクトを返すために操作を変更することをお勧めします。
WCFからJava Webサービスを使用するときに同様の問題が発生しました。
今回のケースでは、返されると言ったタイプは、実際に返されたものの限定バージョンでした。
私たちのために働いたのは、オブジェクトを期待されたタイプにキャストすることでした。その後、データが利用可能になりました。
したがって、問題を解決するために、オブジェクトを期待される型にキャストしようとすることができます。