【发布时间】:2012-09-17 15:18:18
【问题描述】:
我在使用 WCF 服务时遇到此错误。这是我使用 Microsoft Service Trace Viewer 查看错误详情时得到的错误报告:
运行 WSDL 导入扩展时引发异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:引用类型列表在命名空间“http://schemas.datacontract.org/2004/07/WorldVision.NewZealand.CIMS.Common.Entities”中包含一种以上数据协定名称为“EchoAddress”的类型。需要排除除以下类型之一之外的所有类型。只有匹配的类型可以是有效的引用: “CIMS.CrmService.EchoAddress,App_WebReferences.k4hj-nad,版本=0.0.0.0,文化=中性,PublicKeyToken=null”(匹配) “CIMS.AddressService.EchoAddress, App_WebReferences.k4hj-nad, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”(匹配)
看起来有两个名为“EchoAddress”的单独类,我使用 [DataContract] 属性将它们定义为 WCF DataContracts,它们都存在于 WorldVision.NewZealand.CIMS.Common.Entities 命名空间中。我检查过,事实并非如此。该错误还说我需要排除以下类型之一:
CIMS.CrmService.EchoAddress CIMS.AddressService.EchoAddress
但我只在 WorldVision.NewZealand.CIMS.Common.Entities 命名空间中声明了一次“EchoAddress”类。看起来这些是在“CrmService”和“AddressService”中对同一类型(EchoAddress)的引用,它们是我在主项目中作为“服务引用”引用的两个独立的 WCF 服务。
这是 EchoAddress 类的类型声明,它在一个单独的项目中声明,然后由包含实际 WCF 服务的项目引用。然后我的主项目将服务引用为服务引用:
[DataContract]
public class EchoAddress
{
[DataMember]
public string AddressType { get; set; }
[DataMember]
public Dictionary<string,string> AddressLines { get; set; }
...
}
我尝试了以下方法:
- 在 VS2010 中,右键单击 WCF 服务引用 > 配置服务引用 > 从 web 服务引用配置的高级菜单中取消选中“在引用程序集中重用类型,用于 CrmService 和 AddressService WCF 服务。
- 删除 Web 服务引用,关闭 VS2010,以“以管理员身份运行”打开 VS2010,重新添加 Web 服务引用。
- 在整个解决方案中搜索对 EchoAddress 的重复引用
- 为所有数据类型设置 [DataContract(IsReference = false)],如下所示: http://blogs.msdn.com/b/distributedservices/archive/2010/02/04/wcf-client-issue-with-reuse-types-from-referenced-assemblies.aspx
- 检查了任何地方都没有标有 [DataMember] 且也称为 EchoAddress' 的类成员(显然,当存在这种类型的结构时会发生此错误 - 有关详细信息,请参阅上面的链接)
- 检查所有项目引用,以确保没有“循环”类型引用(例如,项目 1 引用项目 2,项目 1 具有对 service1 的服务引用,项目 2 也具有对 service1 的服务引用。检查了服务引用,项目可能导致此问题的引用和“标准”dll 引用。
- 尝试更新服务引用、重建单个项目、整个解决方案以及您能想到的每一种组合!
- 尝试在调试器中单步执行 - 没有提供更多信息,只是在我尝试通过 WCF 服务写入我们的 CRM 时失败,使用 MS Dynamics CRM API 中的 OrganizationServiceContext.SaveChanges()
- 已阅读以下内容:
- http://social.msdn.microsoft.com/Forums/en/wcf/thread/6ab067fe-0607-4b6e-8ab7-a5e2db1dd490
- What does this WCF error mean: "Custom tool warning: Cannot import wsdl:portType"
- http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html
- 我即将读完:
- http://marktinderholt.wordpress.com/2010/02/12/silverlight-wcf-service-reference-weirdness-solved-custom-tool-error-failed-to-generate-code-for-the-service-reference-%E2%80%98servicereference1%E2%80%99-please-check-other-error-and-warnin/
有什么想法吗?
【问题讨论】:
-
“引用程序集中的重用类型”绝对应该设置为 true。但是,我同意 @user544550 的观点 - 如果可能,请避免使用内置的生成服务引用。
标签: c# .net visual-studio-2010 wcf oop