【发布时间】:2012-07-17 08:44:28
【问题描述】:
[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。
在客户端,我收到 wcf 错误“套接字连接已被释放。\r\n对象名称:'System.ServiceModel.Channels.SocketConnection'。”。我怀疑这个错误是因为 ChildAssets 字段。
当我单独禁用此字段时(通过删除 DataMember 标记),然后在客户端,我能够获取所有 Dictionary 元素,并在每个元素中获取除 ChildAssets 之外的所有字段。
我可以看到剩余的字段名称、父节点和优先级。
任何线索为什么 WCF 无法在 Dictionary 元素中序列化 List 吗?
【问题讨论】:
-
你用的是什么客户端?也许客户端上的 web 服务引用需要 ObservableCollection 而不是 List
-
Rumplin,现在客户端和服务器都在同一个进程中。我正在使用 .NET 4.0 框架和 C# 语言。它是一个自托管服务,在客户端(在我的情况下,这只是同一进程中的另一个 dll)我将对象转换为 Dictionary
。一切都很好,除了 DataMember ChildAssets -
只是为了测试,把List
改为ObservableCollection -
当您包含子资产时,您是否可能达到绑定中定义的限制? IE。深度限制,最大缓冲区大小等?要进行测试,请重新包含
ChildAssets并强制该方法仅返回具有单个键值对的字典,其中包含只有一个子项的 AssetData。