【问题标题】:Generic argument property causes error on WebService通用参数属性导致 WebService 出错
【发布时间】:2014-09-05 21:18:47
【问题描述】:
服务:
错误:
错误与具有ChainedListNode<T> 的类型有关。问题是,当我从 Value 中删除 DataMemberAttribute 时,该服务可以正常工作。
[DataContract]
public class ChainedListNode<T>
{
[DataMember]
public T Value { get; set; }
}
对导致它的原因和/或如何解决它有任何想法吗?
【问题讨论】:
标签:
c#
web-services
wcf
service
datamember
【解决方案1】:
问题是开放类型ChainedListNode<T> 中的类型参数意味着ChainedListNode<T>.Value 可以包含任何内容。 WCF 无法创建描述所有可能放置在 Value 属性中的值的协定,因此它拒绝整个类型。当没有Value 属性时,类型参数T 无关紧要,被忽略,一切正常。
在类似情况下,我创建了一个从我的泛型类型派生的封闭类型,并将该类型用作我的数据协定:
[DataContract]
public class ChainedListNodeOfString : ChainedListNode<string>
{
[DataMember]
public string Value { get; set; }
}
如果需要,您可以为需要返回的每种不同类型的值创建派生类型(以及相关的OperationContract)。这会使您的 API 更加冗长,但它确实有效。
【解决方案2】:
我不认为在 WCF 中使用泛型是一个好主意,因为在这种情况下我看不到一个好的序列化,即使你可以实现它,虽然我不确定它是否可能,但我认为你最终可能仍然会出错。
删除 DataMember 时它起作用的原因是,理论上它没有被序列化,仅在后端的服务中没有使用。