【发布时间】: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