我在通过服务代理调用 WCF 服务时遇到错误:类型 [mytype]'1[system.collection.generic.list'1] 无法添加到已知类型列表,因为具有相同数据的另一个类型 [mytype'1]合同已经存在。
知道如何解决这个问题吗??
在我为同一主机运行 svcutil 两次之后,即第一次默认(数组),第二次添加 /ct: 参数以使用列表类型生成。
这是一个与命名约定相关的简单问题。
您可以在 XML 文件中看到,类型名称(如果需要)在 XML 中表示为简单名称,而不需要 C# 命名空间。相反,使用由
[DataContract]
属性声明的命名空间。比方说,您对整个数据协定仅使用一个唯一的命名空间字符串。然后,该命名空间仅在 XML 中出现一次,作为根数据图对象的命名空间。类型的标识不是由不同的命名空间表示,而是由数据协定命名空间表示。这是一个非常明智的功能:您可以自由地更改源代码中的命名空间和相应的限定名称,而无需违反合同。您还可以在数据契约中使用不同的数据契约命名空间,但对象图根以外的命名空间将出现在 XML 中。
该命名的唯一问题出现在数据契约技术无法解决的名称冲突的情况下。您的异常信息表明了其中一种情况。为什么两种不同类型的名称相同
mytype
?例如,这种情况可能会发生,因为它们具有不同的限定名称,即不同的命名空间名称。从编程的角度来看这很好,但数据契约机制无法解决这种冲突。
要解决此冲突,您可以
[DataContract]
属性中规定),以及另一个 — 不同的命名空间。只要有可能,我强烈推荐解决方案#1——事情不应该比必要的更复杂。