WCF IList序列化问题

我有一个对象,其中包含从WCF Web服务方法返回的通用IList:

[DataContract(Name = "PageableList_Of_{0}")] public class PageableResults { [DataMember] public IList Items { get; set; } [DataMember] public int TotalRows { get; set; } } [OperationContract] PageableResults ListCI(); 

当我在服务上调用此方法时,它会执行整个方法,但最后会抛出System.ExecutionEngineException而不会发生InnerException。 我已经尝试返回一个具体的List 对象,这似乎有效,但不幸的是我需要找到一个解决方法来返回一个IList。 我需要输入任何属性来解决这个问题吗?

对于T的每个用法,您必须在类定义上方的类定义中添加KnownTypes属性。如下所示:

 [KnownType(typeof(ContentItem))] [DataContract(Name = "PageableList_Of_{0}")] public class PageableResults { [DataMember] public IList Items { get; set; } [DataMember] public int TotalRows { get; set; } } [OperationContract] PageableResults ListCI(); 

或者,您可以定义自己的集合类,它具有TotalRows属性,如下所示:

 [KnownType(typeof(ContentItem))] [DataContract(Name = "PageableList_Of_{0}")] public class PageableResults : EntityCollectionWorkaround { [DataMember] public int TotalRows { get; set; } } 

这里定义了EntityCollectionWorkaround:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html

我认为你不能做到这一点。 序列化器将如何知道要去哪个desearialize? 很多东西都可以实现IList,而接口没有构造函数。

看起来这是WCF中的一个错误,它在.NET 4中得到修复。但是,此线程中列出了几种解决方法:
http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=433569

摘要:
– 将包含DataContracts的程序集放入GAC。
– 将LoaderOptimization设置为SingleDomain。

inheritance自PageableResults以创建一个封闭的generics子类,在您的情况下是PageableContentItem或类似的东西,并将其用作返回类型。 对于webservices,通常使用xml序列化程序,它需要事先知道所有内容,这就是为什么你也不能返回接口类型。

  public class PageableContentItem : PageableResults { } [OperationContract] PageableContentItem ListCI();