WCF的KnownType异常

时间:2015-04-14 14:07:05

标签: c# wcf known-types

我有以下服务接口

[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 \”的数据,并且deserializere不知道具有该名称的任何类型。

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

知道如何解决问题吗?

1 个答案:

答案 0 :(得分:0)

您是否在TreeItem上有[DataContract]属性?这是必需的。如果TreeItem确实设置了[DataContract]属性,我还有其他一些想法,但可能需要更多的代码才能发布。所以试一试,让我知道我是否可以提供更多帮助。

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

当标有“数据合同”属性的类符合以下某个类时,需要使用KnownType:

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

source

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

相关问题