WCF 的已知类型异常

KnownType Exception with WCF

我有以下服务接口

[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; }
}

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

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

}

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

表示该元素 \"http://schemas.datacontract.org/2004/07/Core.Base:_x003C_Parent_x003E_k__BackingField\" contains Data of the Type \"http://schemas.datacontract.org/2004/07/Core.Base:TreeItem\" 并且反序列化器不知道任何具有该名称的类型。

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

知道如何解决这个问题吗?

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

关于其他问题的提示可以在 MSDN 上找到数据合同已知类型。

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

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

source

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