0

我有以下服务接口

[ServiceContract]
public interface ICacheService
{
    [OperationContract]
    IEnumerable<CacheResponse> GetCache(IEnumerable<CacheRequest> requests);
}

[DataContract]
[KnownType(typeof(CacheItem))]
[KnownType(typeof(TreeItem))]
[KnownType(typeof(TreeTopGroup))]
[KnownType(typeof(TreeGroup))]
[KnownType(typeof(TreeView))]
[KnownType(typeof(ITreeItem))]
public class CacheResponse
{
    [DataMember]
    public IDictionary<string, CacheItem> CacheItems { get; set; }
    [DataMember]
    public IEnumerable<KCSLuceneDocument> LuceneDocuments { get; set; }
}

该请求有效,所以我不会发布它。Response 仅包含一个 DateTime、一个 String 和一个 TreeItem 列表。TreeItem 类的重要部分

public class TreeItem : ITreeItem 
{
    public ITreeItem Parent { get; set; }
    .
    . more stuff

}

一旦父属性设置为 null 以外的值,客户端就会收到 System.ServiceModel.Dispatcher.NetDispatcherFaultException。

说明元素“ http://schemas.datacontract.org/2004/07/Core.Base:_x003C_Parent_x003E_k__BackingField ”包含类型为“http://schemas.datacontract.org/2004/07/Core”的数据。 Base:TreeItem \" 并且反序列化器不知道任何具有该名称的类型。

我尝试使用 KnownType 属性以及 ServiceKnownType 属性。两者都没有帮助。唯一有效的是将 Parent 的类型更改为 TreeItem ,我真的不想这样做。特别是因为它可以在其他一些位置包含 ITreeItems,这很可能也会破坏服务。

知道如何解决问题吗?

4

1 回答 1

0

你有 TreeItem 上的 [DataContract] 属性吗?那将是必需的。如果 TreeItem 确实设置了 [DataContract] 属性,我还有其他一些想法,但可能需要发布更多代码。所以试一试,如果我能提供更多帮助,请告诉我。

可以在 MSDN for Data Contract Known Type 上找到有关其他问题的提示。

当标有 Data Contract 属性的类满足以下条件之一时,需要 KnownType:

  • 发送的数据合约源自预期的数据合约。有关详细信息,请参阅数据协定等效性中有关继承的部分)。在这种情况下,传输的数据与接收端点所期望的数据合同不同。
  • 要传输的信息的声明类型是接口,而不是类、结构或枚举。因此,无法预先知道实际发送的是哪种实现接口的类型,因此接收端点无法预先确定传输数据的数据协定。
  • 要传输的信息的声明类型是Object。因为每种类型都继承自 Object,并且无法提前知道实际发送的是哪种类型,所以接收端点无法提前确定传输数据的数据协定。这是第一项的特例:每个数据合约都派生自默认值,即为 Object 生成的空白数据合约。
  • 某些类型(包括 .NET Framework 类型)具有属于上述三个类别之一的成员。例如,Hashtable 使用 Object 将实际对象存储在哈希表中。在序列化这些类型时,接收方无法提前确定这些成员的数据协定。

资源

如果它被标记为 [DataContract],您可能需要在 TreeItem 类本身上添加一个 [ServiceKnownType] 属性以显示 TreeItem.Parent 属性的可能性。这只是一个猜想,我需要先看更多代码。

于 2015-04-15T20:30:08.987 回答