【问题标题】:How to solve BizTalk message type conflict when 2 procedures from 2 different databases share names?当来自 2 个不同数据库的 2 个过程共享名称时,如何解决 BizTalk 消息类型冲突?
【发布时间】:2017-06-08 10:42:52
【问题描述】:

我有两个数据库

  1. DB1
  2. DB2

我在这两个数据库中都有一个过程dbo.Procedure

我正在使用“使用适配器服务”来从 BizTalk 执行这些过程。

执行时出现错误:

在接收位置发送到适配器“WCF-Custom”的响应消息: xxx... 原因:找不到文档 规范,因为多个模式与消息类型匹配 http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo#Procedure"。

如何在不重命名 DB1 或 DB2 中的过程的情况下解决此问题?

【问题讨论】:

  • 您不需要创建包装器或更改输出类型。那只会让事情变得更复杂。您所需要的只是每个接收位置的自定义管道。这是正确的程序。

标签: c# .net biztalk biztalk-2013


【解决方案1】:

对于简单的 BizTalk 场景,另一种方法是使用 CompositeOperation 架构。 这样您就可以避免从存储过程中部署架构。

在“复合”模式中,您可以添加所有其他受支持的 SQL 操作。 您的发送端口上的操作将是“CompositeOperation”。

您的复合模式将如下所示: Composite Operation

出于开发目的,您仍然可以为存储过程生成架构,因为它将帮助您完成 XSLT,但您不再需要在 BizTalk 中部署它。

另请注意,当使用 BizTalk Mapper 而不是自定义 XSLT 时,此方法将不起作用。

【讨论】:

    【解决方案2】:

    使用相同的根 + 命名空间部署 Schema 是有问题的,有时,这种情况是不可避免的。

    1. 创建两个自定义管道,每个管道都使用 XmlDisassembler。
    2. 在每个 XmlDisassembler 中,将文档规范设置为您希望在该端口上处理的规范。
    3. 部署。
    4. 将接收管道设置为该位置的自定义管道。

    【讨论】:

      【解决方案3】:

      我会避免使用相同的 targetNamespace 和根节点名称部署任何架构 - 但如果必须将 TypedProcedure 类型与 WCF-SQL/自定义适配器一起使用,则不能这样做。

      解决方法:

      • 如果您实际上没有返回键入的结果集,请不要同时使用TypedProcedure。请记住,您可以酌情使用ProcedureXmlProcedure,特别是如果您不处理返回的结果集(例如,如果只有返回代码或proc 实际上返回XML,例如SELECT ... FOR XML ...) .事实上,如果您从 proc(s) 返回 XML,那么您最好使用带有强类型模式的 XmlProcedure 来获得该结果。如果他们都只是返回常规返回值,我宁愿这样做......
      • 如果这不起作用,请为一个或两个创建一些包装程序。例如。在 DB1 上创建一个名为 bts.Db1Procedure 的新过程(我喜欢将 BizTalk 特定过程放在名为 bts 的架构中,以便 DBA 意识到这就是它的用途,但这也可以与 dbo 一起使用)。让此过程采用相同的参数并将它们传递给dbo.Procedure。重新生成/修改您的架构以指向此过程而不是冲突的过程。

      要记住的是,适配器使用targetNamespace 和根节点名称来计算

      1. proc 所在的架构
      2. 过程的名称
      3. 结果集的形状(通用、类型化或 xml)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-04
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 2013-10-21
        相关资源
        最近更新 更多