我有一个对象,其中包含从WCF Web服务方法返回的通用IList:
[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T>
{
[DataMember]
public IList<T> Items { get; set; }
[DataMember]
public int TotalRows { get; set; }
}
[OperationContract]
PageableResults<ContentItem> ListCI();
当我在服务上调用此方法时,它会很好地执行整个方法,但最后会抛出System.ExecutionEngineException而不会发生InnerException。我已经尝试返回一个具体的List&lt;&gt;对象,这似乎工作,但不幸的是我需要找到一个解决方法来返回IList。我需要提出任何属性来解决这个问题吗?
答案 0 :(得分:1)
我认为你不能这样做。序列化器如何知道要去哪个desearialize?很多东西都可以实现IList,而接口没有构造函数。
答案 1 :(得分:1)
这似乎是WCF中的一个错误,它在.NET 4中得到修复。但是,此主题中列出了几种解决方法:
http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=433569
摘要:
- 将包含DataContracts的程序集放入GAC
- 将LoaderOptimization设置为SingleDomain。
答案 2 :(得分:1)
对于T的每个用法,您必须在类定义上方的类定义中添加KnownTypes属性。如下所示:
[KnownType(typeof(ContentItem))]
[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T>
{
[DataMember]
public IList<T> Items { get; set; }
[DataMember]
public int TotalRows { get; set; }
}
[OperationContract]
PageableResults ListCI();
或者,您可以定义自己的集合类,它具有TotalRows属性,如下所示:
[KnownType(typeof(ContentItem))]
[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T> : EntityCollectionWorkaround<T>
{
[DataMember]
public int TotalRows { get; set; }
}
这里定义了EntityCollectionWorkaround:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html
答案 3 :(得分:0)
继承自PageableResults以创建一个封闭的泛型子类,在您的情况下是PageableContentItem或类似的东西,并将其用作返回类型。对于webservices,通常使用xml序列化程序,它需要事先知道所有内容,这就是为什么你也不能返回接口类型。
public class PageableContentItem
: PageableResults<ContentItem>
{
}
[OperationContract]
PageableContentItem ListCI();