Biztalk 如何使用BRE解析行程中编排之后发生的转换服务?

Biztalk 如何使用BRE解析行程中编排之后发生的转换服务?,biztalk,biztalk-2009,esb-toolkit-2.0,Biztalk,Biztalk 2009,Esb Toolkit 2.0,在尝试使用Biztalk ESB Toolkit 2.0实现简单的集成模式时,我遇到了一个问题,即试图解决编排之后发生的转换行程服务 我使用BRE解析器来执行需要检查上下文消息类型属性以确定要使用的适当映射的规则。但是,一旦消息到达与转换服务关联的行程中的步骤,映射将无法执行 经过仔细调查,似乎没有将消息类型提供给BRE解析器内部使用的解析对象。实际上,由于离开前面业务流程的消息类型为System.Xml.XmlDocument,因此消息的类型将从上下文降级 通过跟踪规则引擎的执行,我可以观察到

在尝试使用Biztalk ESB Toolkit 2.0实现简单的集成模式时,我遇到了一个问题,即试图解决编排之后发生的转换行程服务

我使用BRE解析器来执行需要检查上下文消息类型属性以确定要使用的适当映射的规则。但是,一旦消息到达与转换服务关联的行程中的步骤,映射将无法执行

经过仔细调查,似乎没有将消息类型提供给BRE解析器内部使用的解析对象。实际上,由于离开前面业务流程的消息类型为System.Xml.XmlDocument,因此消息的类型将从上下文降级

通过跟踪规则引擎的执行,我可以观察到消息的类型在到达BRE解析器时确实丢失了。消息的类型为空,而文档的强类型为Microsoft.XLANGs.BaseTypes.Any

我使用的编排服务直接取自ESB Toolkit 2.0附带的示例


有没有一种方法可以在行程中进行编排后执行基于上下文的BRE解析?

回答我自己的问题。。。简言之,关键是预先设置原始消息的上下文并提升MessageType上下文属性。在以下段落中,我将转载一篇即将发表的关于:

编排行程服务101

在努力做到这一点并尝试不同的解决方案后,我终于成功地遵循了一套简单的规则。在这篇文章中,我想简要介绍一个行为良好的ESB Toolkit 2.0友好编排的组成部分,它可以用作行程服务,并且仍然可以利用业务规则引擎解析器进行基于消息上下文类型的动态转换

行程服务的上下文订阅

首先,设计用作行程服务的编排需要有一个直接绑定的逻辑端口,该端口链接到一个接收形状,该形状定义了ESB友好的订阅,如下所示:

Microsoft.Practices.ESB.Itinerary.Schemas.ServiceName == "MyCustomItineraryService" And
Microsoft.Practices.ESB.Itinerary.Schemas.ServiceState == "Pending" And
Microsoft.Practices.ESB.Itinerary.Schemas.ServiceType == "Orchestration"
文档中没有提到这一点,但这清楚地表明,直接绑定端口操作需要映射到System.Xml.XmlDocument类型的消息。事实上,如果不是这样,编排将无法执行,路由失败错误消息将注册到消息框中

顺便说一句,这意味着消息的类型根本不被考虑在内。这在很大程度上解释了为什么在执行编排之后,业务规则引擎解析器无法确定正确的转换

了解行程

编排开始处表达式形状中的以下代码有助于检索当前行程步骤:

// Retrieve the current itinerary step.
itinerary.Itinerary = Microsoft.Practices.ESB.Itinerary.ItineraryOMFactory.Create(InboundMessage);
itineraryStep.ItineraryStep = itinerary.Itinerary.GetItineraryStep(InboundMessage);
保留原始消息的上下文

接下来,在编排的每个步骤中,必须保留原始消息的大部分上下文。当编排中有几个中间构造形状来执行手头的特定场景时,这一点尤为重要

OutboundMessage(*) = SourceMessage(*)
请注意,我在上面的句子中写了大部分内容。事实上,正如我们将在一分钟后看到的,结果消息的类型需要出现在编排结束时的上下文中。最有可能的是,这将是与原始入站消息不同的类型。由于不可能指定只读属性,因此有时要实现这一点非常困难

为此,您可能必须求助于在编排内部执行自定义管道或其他奇特的技术。然而,在大多数情况下,上面显示的语法应该是有效的

推进行程

在编排结束时,不能忘记以下非常简单的代码:

itinerary.Itinerary.Advance(OutboundMessage, itineraryStep.ItineraryStep);
提升上下文属性

没有明确说明必须遵循的确切步骤,或者即使需要从这样的编排中提升属性,但是查看作为源代码提供的示例,可以发现以下属性参与了解析机制:

然而,在本文概述的场景中,这显然是不够的

为了使基于上下文的规则在业务流程之后工作,还需要提升BTS.MessageType属性。这可以通过在业务流程结束时初始化发送形状上的关联轻松实现

而且它有效

在结果消息的上下文中提升消息类型是我最初尝试中缺少的。一旦确定了这一点,行程就像一个符咒

即使解决方案在事后看起来很明显,但如果我知道这一点,肯定会对我有所帮助 躺卧者。我希望这篇文章能帮助那些遇到同样问题的人