[DataContract]
public class AssetData
{
[DataMember]
public string Name { get; set; }
[DataMember]
public List<AssetData> ChildAssets { get; set; }
[DataMember]
public int Priority { get; set; }
[DataMember]
public AssetData ParentNode { get; set; }
}
[ServiceKnownType(typeof(Dictionary<string, AssetData>))]
public interface IRtxEquipmentConfiguration
{
[OperationContract]
object GetData(string sKey, string sRequest);
}
上記の OperationContract"GetData"
の場合、サーバーは AssetData のディクショナリを返します。AssetData を DataContract としてマークし、そのすべてのフィールドを DataMembers としてマークしました。クライアント側で、「ソケット接続が破棄されました。\r\nオブジェクト名: 'System.ServiceModel.Channels.SocketConnection'.」という wcf エラーが発生していました。このエラーは、ChildAssets フィールドが原因であると思われます。このフィールドを単独で無効にすると (DataMember タグを削除して)、クライアント側ですべてのディクショナリ要素を取得でき、各要素で ChildAssets を除くすべてのフィールドを取得できました。残りのフィールド Name、ParentNode、および Priority を確認できます。
WCF がディクショナリ要素でリストをシリアル化できない理由の手がかりはありますか?