【问题标题】:Sharing a class library between two WCF services在两个 WCF 服务之间共享一个类库
【发布时间】:2012-03-02 12:15:13
【问题描述】:

我有两个 WCF 服务应用程序,它们在彼此之间传递数据传输对象以执行某些操作。我已将 DataContracts 移至 Common 项目,因为这似乎是合乎逻辑的事情,但我在添加对 WCF 服务应用程序之一的服务引用时遇到问题。对于服务的不同部分(合同、服务等),我遇到了 4 个类似的错误:

自定义工具警告:无法导入 wsdl:portType 详细信息:运行 WSDL 导入扩展时引发异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:在命名空间“http://schemas.datacontract.org/2004”中使用数据合同名称“LicenceForm”引用类型“ServiceLibraryName.Common.Data.LicenceForm, Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null” /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 并引用程序集也会产生相同的错误。

欢迎任何想法或建议。

【问题讨论】:

  • 您是否尝试将服务引用添加到共享程序集?
  • 您好,感谢您的回复。不知道你在这里是什么意思?为什么我的数据合同项目需要引用正在使用它的服务?

标签: c# .net wcf


【解决方案1】:

WCF WSDL 生成器默认使用服务类的 C# 命名空间的一部分来生成 WSDL 中引用的 XML 命名空间。由于您有两个服务使用一个通用项目(具有自己的 C# 命名空间),因此生成的 WSDL 可能与“通用”DataContract 类不同。

您可以使用Namespace property 控制带有 DataContract 标记的类(以及 OperationContract 和 ServiceContract 属性)的 XML 命名空间。如果您有很多 DTO,这可能真的很乏味,因此作为替代方案,设置程序集级别 ContractNamespace attribute 以标记所有适当的类。

【讨论】:

  • 您好,感谢您的回复。我已按照您的建议设置了程序集和 xml 命名空间,但问题仍然存在。还有什么我可以尝试的吗?
  • ContractNamespaceAttribute 是你的朋友。感谢六度的回复!这为我解决了这个问题。
【解决方案2】:

原来这是由我添加的将 Cdata 字段作为字符串处理的一段代码引起的问题。当我将此字段更改为字符串而不是 CdataWrapper 时,它可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    相关资源
    最近更新 更多