2

我有两个不同的服务器,两个类似的 WCF 服务正在其上运行。两种服务完全相同(克隆)。我必须在一个编排中使用这两个服务,因为我必须将它们相互通信。(我正在使用“添加生成的项目”来添加服务参考)。我想从一种名为“Get”的服务方法获取数据并将其发送给其他“Send”方法。部署项目后,我收到错误消息"Cannot locate document specification because multiple schemas matched the message type #####"

我已经阅读了使用特定文档架构创建自定义管道的解决方案,但没有奏效。

我该如何处理这种情况?

4

3 回答 3

1

问题是您现在在 BizTalk 应用程序中有多个架构,它们具有相同的命名空间和根元素。

您需要设置“获取服务”和“发送服务”的DocumentSpecNames属性,以告诉 BizTalk 使用哪一个。XMLReceivePipelineXMLTransmitPipeline

这个值的基本格式是...Schemaname+Rootname,Assembly

例子:

Company.Schemas.Messages+GetReply,Company.Schemas, 
   Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
于 2013-01-30T10:55:54.893 回答
1

如果服务确实相同,那么您不需要使用向导两次导入架构 - 只需导入第一个服务的 WSDL 以创建架构和端口类型,然后创建一个新的发送端口*并相应地更改绑定指向第二个服务(即特别是服务 URL)。

如果您的 WCF 服务使用MessageContracts为多个服务调用接受或返回相同的消息有效负载(而不是DataContract,您通常应该获得表单的“唯一”根元素名称xmlns#MyMethodxmlns#MyMethodResponse),则通常也会发生这种情况。

在这种情况下(即 common MessageContracts),除了 basvo 的回答之外,您还可以通过以下方式绕过此问题:

  1. 将所有使用的 WCF 服务的所有工件导入 Visual Studio 中的 BTS 项目。
  2. 保留每个请求(或响应模式)的第一个“实例”,然后在 VS 的 Orchestration 视图中,遍历每个第二个和后续端口类型,并删除端口上重复的请求或响应消息(“操作消息”)类型。(在每个端口类型下,您应该看到请求、响应以及任何故障消息类型)
  3. 然后,您需要“编辑”已删除的每种消息类型,然后手动将其更改为您保留的架构的原始实例。
  4. 您可能还需要从导入的.xsd文件中删除或更糟的是破解重复的消息类型。

但是,如果您的 Web 服务发生更改并且您需要再次“刷新”您导入的模式,这将是一个痛苦 - 如果导入向导检测到重复的模式并提供以这种方式为您合并它们,这将是一个很好的功能。

* 更新- 只是为了澄清,在您的 orch 设计中重用相同的逻辑发送端口,但在部署的 BTS 服务器/集群中创建一个新的发送端口,将发送端口订阅到所需的消息/将第二个 Orch 链接到发送端口(取决于您是否使用直接绑定),并且显然将绑定更改为第二个 URL。

于 2013-01-30T12:20:50.387 回答
0

由于这些服务相同,因此只需为其中任何一项添加服务引用即可添加所需的架构。只需在 BizTalk MMC 中为每个服务创建单独的发送端口,并在配置编排时将编排中创建的逻辑端口连接到正确的发送端口。

该解决方案有效.....

于 2013-01-31T05:58:42.933 回答