MSDNからServiceKnownTypeの例を実装しようとしたときに問題が発生しました。svcutilは、生成されたインターフェイスプロキシからServiceKnownType属性を省略します。
[DataContract()]
public class Widget
{
[DataMember]
public string Id;
[DataMember]
public string Catalog;
}
[DataContract()]
public class Machine : Widget
{
[DataMember]
public string Maker;
}
そして、次のインターフェイス:
[ServiceKnownType(typeof(Widget))]
[ServiceKnownType(typeof(Machine))]
[ServiceContract()]
public interface ICatalog
{
[OperationContract]
Hashtable GetItems();
}
問題は、プロキシクラスが生成されたとき(「サービス参照の追加」を使用していることである/ svcutil.exe彼らは次のクラスを提供例で )、 "ServiceKnownType"属性はIChalogプロキシインターフェイスから除外され、結果として例外が発生する "メッセージを逆シリアル化しようとしている間にフォーマッタが例外をスローしました:... "ウィジェット "に対応するタイプを既知のタイプのリスト" この問題を解決するには、生成されたプロキシインタフェースに既知のサービス属性を手動で追加する必要があります。これは非常に悪い解決策です。参照を更新するとコードが再生成されるためです。 全てのこのような状況で興味深いのは、すなわち、のgetItems操作ではなく、ハッシュテーブルのオブジェクト、またはパラメータとしてオブジェクトを取得を返す場合は、その問題が解決されることを
[OperationContract]
object GetItems();
または
[OperationContract]
Hashtable GetItems(object obj);
です
の結果、ICatalogプロキシインターフェイスに「ServiceKnownType」属性が存在します。 誰もこの問題を解決する方法を知っていますか?
おかげ
実際のシナリオでは、「ウィジェット」クラスに属性を追加できないため、ServiceKnownTypeではなくKnownTypeで動作させたいのですが、それは変更できないDLLにあるためです。私のシナリオでは他のソリューションに感謝しますが、MSDNの例がうまくいかない理由を知りたい – Andy