C# WCF错误:需要排除除以下类型之一以外的所有类型。只有匹配的类型才能是有效的引用

C# WCF错误:需要排除除以下类型之一以外的所有类型。只有匹配的类型才能是有效的引用,c#,.net,visual-studio-2010,wcf,oop,C#,.net,Visual Studio 2010,Wcf,Oop,我在使用WCF服务时遇到此错误。这是我使用Microsoft Service Trace Viewer查看错误详细信息时得到的错误报告: 运行WSDL导入扩展时引发异常:System.ServiceModel.Description.DataContractSerializerMessageCompactImporter 错误:引用类型列表包含多个命名空间“”中数据协定名称为“EchoAddress”的类型。需要排除除以下类型之一以外的所有类型。只有匹配的类型才能是有效的引用: “CIMS.Cr

我在使用WCF服务时遇到此错误。这是我使用Microsoft Service Trace Viewer查看错误详细信息时得到的错误报告:

运行WSDL导入扩展时引发异常:System.ServiceModel.Description.DataContractSerializerMessageCompactImporter 错误:引用类型列表包含多个命名空间“”中数据协定名称为“EchoAddress”的类型。需要排除除以下类型之一以外的所有类型。只有匹配的类型才能是有效的引用: “CIMS.CrmService.EchoAddress,App_WebReferences.k4hj-nad,版本=0.0.0.0,区域性=中性,PublicKeyToken=空”(匹配) “CIMS.AddressService.EchoAddress,App_WebReferences.k4hj-nad,版本=0.0.0.0,区域性=中性,PublicKeyToken=空”(匹配)

它看起来像是有两个单独的类叫做“EchoAddress”,我使用[DataContract]属性将它们定义为WCF DataContracts,它们都存在于WorldVision.NewZealand.CIMS.Common.Entities命名空间中。我查过了,但事实并非如此。错误还表示需要排除以下类型之一:

CIMS.CrmService.EchoAddress CIMS.AddressService.EchoAddress

但是我只在WorldVision.NewZealand.CIMS.Common.Entities命名空间中声明一次“EchoAddress”类。看起来这些是对同一类型(EchoAddress)的引用,在“CrmService”和“AddressService”中,这是两个独立的WCF服务,我从我的主项目中引用为“服务引用”

这是EchoAddress类的类型声明,该类在单独的项目中声明,然后由包含实际WCF服务的项目引用。然后,我的主项目将该服务引用为服务引用:

[DataContract]
public class EchoAddress
{
    [DataMember]
    public string AddressType { get; set; }
    [DataMember]
    public Dictionary<string,string> AddressLines { get; set; }

    ...
}
[DataContract]
公共类回音地址
{
[数据成员]
公共字符串地址类型{get;set;}
[数据成员]
公共字典地址行{get;set;}
...
}
我尝试了以下方法:


  • 在VS2010中,对于CrmService和AddressService WCF服务,右键单击webservice引用配置的高级菜单中的WCF服务引用>配置服务引用>取消选中的“引用程序集中的重用类型”
  • 删除web服务引用,关闭VS2010,使用“以管理员身份运行”打开VS2010,重新添加web服务引用
  • 搜索整个解决方案以查找对EchoAddress的重复引用
  • 为所有数据类型设置[DataContract(IsReference=false)],如下所示:
  • 检查是否没有标记有[DataMember]且也称为EchoAddress的类成员(显然,当这种类型的结构存在时,可能会发生此错误-有关详细信息,请参阅上面的链接)
  • 已检查所有项目引用,以确保不存在“循环”类型引用(例如,项目1引用项目2,项目1具有对服务1的服务引用,项目2也具有对服务1的服务引用。已检查可能导致此情况的服务引用、项目引用和“标准”dll引用
  • 尝试更新服务引用、重建单个项目、整个解决方案,以及您能想到的所有组合
  • 尝试在调试器中单步执行-不提供任何更多信息,只是在尝试使用MS Dynamics CRM API中的OrganizationServiceContext.SaveChanges()通过WCF服务写入CRM时失败
    • 我读过这些:
    • 我刚刚读完:

有什么想法吗?

由于各种神秘的问题,例如,当我们的服务复杂性增加时,我们完全放弃了添加服务引用方法。原因是缺乏控制、幸灾乐祸和错误。如果您主要使用.net world的服务,请观看以下视频


这还将为您提供大量内部信息,并帮助您调试wcf问题。一旦您采取行动,您就再也不会回来了!

谢谢-我会看一看。虽然现在我需要一个快速解决方案或解决方案,因为项目已经过期。其他开发人员也在同一项目上工作,不希望结构发生变化,因此,我需要暂时解决这个问题。“引用程序集中的重用类型”应该明确设置为true。但是,我同意@user544550的观点-如果可能的话,避免使用内置的generate service引用。