我有以下服务接口
[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,这很可能也会破坏服务。
知道如何解决问题吗?
答案 0 :(得分:0)
您是否在TreeItem上有[DataContract]属性?这是必需的。如果TreeItem确实设置了[DataContract]属性,我还有其他一些想法,但可能需要更多的代码才能发布。所以试一试,让我知道我是否可以提供更多帮助。
可以在MSDN for Data Contract Known Type上找到有关其他问题的提示。
当标有“数据合同”属性的类符合以下某个类时,需要使用KnownType:
如果用[DataContract]标记,您可能需要在TreeItem类本身上添加[ServiceKnownType]属性,以显示TreeItem.Parent属性的可能性。这只是一个猜想,我需要先看一点代码。