我有两个WCF服务应用程序,它们在彼此之间传递数据传输对象以执行某些操作。我已将DataContracts移动到Common项目,因为这似乎是合乎逻辑的事情,但我在向其中一个WCF服务应用程序添加服务引用时遇到问题。我为服务的不同部分(合同,服务等)收到了4个类似的错误:
自定义工具警告:无法导入wsdl:portType 详细信息:运行WSDL导入扩展时抛出异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:引用类型'ServiceLibraryName.Common.Data.LicenceForm,Common,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null',名称空间为http://schemas.datacontract.org/2004,数据协定名称为“LicenceForm”无法使用/07/ServiceLibraryName.Common.Data',因为它与导入的DataContract不匹配。需要从引用的类型中排除此类型。 XPath到错误源://wsdl:definitions[@targetNamespace='http://schemas.datacontract.org/2004/07/ServiceLibraryName.Common.Data']/wsdl:portType[@name='ILicenceGeneration'] C: \ SourceCode \ Release 2 \ ServiceLibraryName \ Sharepoint \ Service References \ LicenceGenerationCrm \ Reference.svcmap 1 1 Sharepoint
我确信引用的文件程序集在服务和使用者上都是相同的文件,但我无法解决此消息。将检查“服务引用配置”中的重用程序集。
使用SVCUtil并引用程序集也会产生相同的错误。
欢迎任何想法或建议。
答案 0 :(得分:2)
WCF WSDL生成器默认使用服务类的C#命名空间的一部分来生成WSDL中引用的 XML命名空间 。由于您有两个使用公共项目(具有自己的C#名称空间)的服务,因此生成的WSDL可能与“常见”DataContract类不同。
您可以使用Namespace property控制DataContract标记类(以及OperationContract& ServiceContract属性)的XML命名空间。如果您有很多DTO,这可能非常繁琐,作为替代方案,将程序集级别ContractNamespace attribute设置为标记所有适当的类。
答案 1 :(得分:1)
原来这是一个问题引起的问题,我添加了一些代码来处理Cdata字段作为字符串。当我将此字段更改为字符串而不是CdataWrapper时,它可以正常工作。