【问题标题】:KnownType Exception with WCFWCF 的 KnownType 异常
【发布时间】:2015-04-14 14:07:04
【问题描述】:

我有以下服务接口

[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,这很可能也会破坏服务。

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

【问题讨论】:

    标签: c# wcf known-types


    【解决方案1】:

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

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

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

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

    source

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

    【讨论】:

    • 谢谢。为 TreeItem 添加适当的 DataContract 解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2011-08-12
    • 2011-02-21
    相关资源
    最近更新 更多