65.9K
CodeProject 正在变化。 阅读更多。
Home

深入探究 BizTalk Server 2006/2006 R2/2009/2010 中的 BizTalk 多部分消息功能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (9投票s)

2010 年 10 月 11 日

CPOL

6分钟阅读

viewsIcon

78907

downloadIcon

772

本文解释了如何在 BizTalk 中使用多部分消息以及何时使用。

引言

在与多位 BizTalk 开发人员打交道的这些年里,我注意到很少有人了解 BizTalk 多部分消息以及如何正确使用它们。在本文中,我将尝试解释如何在 BizTalk 中使用多部分消息以及何时使用。

环境

本文中的概念和代码适用于 BizTalk Server 2006/2006 R2/2009/2010。

什么是 BizTalk 多部分消息?

在 BizTalk Server 中,多部分消息是指包含一个或多个部分的消息,其中每个部分可以是 XML 架构定义 (XSD) 架构或 .NET 类。

当在 BizTalk 中创建多部分消息时,第一个部分将是消息的正文部分。这意味着第一个部分的属性“消息正文部分”将为“true”。对于多部分消息中的所有后续部分,属性“消息正文部分”将为“false”。请注意,多部分消息部分的创建顺序至关重要,因为这可以避免编译错误。

Multipart_Structure.JPG

为了使 BizTalk 多部分消息有效,每个多部分消息最多只能有一个消息正文部分设置为“true”。换句话说,只能有一个部分的“消息正文部分”设置为“true”。

在编排中创建 BizTalk 多部分消息所需的步骤是什么?

步骤 1:在“编排视图”窗口中,展开“类型”节点,右键单击“多部分消息类型”,然后单击“新建多部分消息类型”。

Multipart_Message.JPG

步骤 2:选择 “MultipartType_1” ,然后选择 “MessagePart_1” ,并相应地重命名。请注意,对于 “MessagePart_1” 部分,由于它是第一个部分,因此属性“消息正文部分”将为 “true”

Message_properties.JPG

步骤 3:为 “MessagePart_1” 部分选择“类型”属性,并将其与将成为架构的类型关联。

BizTalk 多部分消息的消息类型是什么?

BizTalk 消息的消息类型由 BTS.MessageType 属性标识。对于多部分消息,它将是属性 “消息正文部分” = “true” 的消息部分。

当 BizTalk 编排接收到的多部分消息中的部分多于最初声明的部分时会发生什么?

如果 BizTalk 编排接收到的多部分消息中的部分数量多于已声明的部分数量,则编排引擎会将合适的部分类型映射到与声明的消息类型中的部分数量匹配的部分,然后为剩余的部分构造 XmlDocument 部分。

捕获这些附加部分的步骤是什么?

步骤 1:声明两个变量,'xLangMessage' 和 'xLangPart' ,它们的类型分别为 Microsoft.XLANGs.BaseTypes.XLANGMessage Microsoft.XLANGs.BaseTypes.XLANGPart 。请注意,您可能需要引用 DLL 'Microsoft.XLANGs.BaseTypes'。

步骤 2:将多部分消息分配给步骤 1 中声明的变量 'xLangMessage'。

步骤 3:循环遍历多部分消息以一次检索一个部分。不要忘记递增循环计数器。

XLangPart.JPG

循环条件

count < xLangMessage.Count

提取

xLangPart = xLangMessage[count];
count = count + 1;

是否有办法在运行时向 BizTalk 多部分消息添加其他部分?

是的,在编排中,BizTalk Server 提供了向多部分消息添加部分的功能。

步骤 1:创建一个变量,命名为 'msgPart',类型为 Microsoft.XLANGs.BaseTypes.XLANGMessage ,您需要引用 DLL 'Microsoft.XLANGs.BaseTypes'。

步骤 2:放置一个表达式形状并添加以下行

//Microsoft.XLANGs.BaseTypes.XLANGMessage.AddPart
//(System.Object objectName, String.String partName);
msgPart.AddPart(objectName, partName);

其中 objectNamexmlDocument 实例,partName 是多部分消息部分的名称。

何时使用 BizTalk 多部分消息?

场景 1:使用多部分消息类型包装底层架构。

BizTalk 消息始终与架构相关联。通过创建多部分消息并将架构作为其一部分进行关联,提供了一个间接层。将消息的 messageType 设置为这个新创建的多部分消息。

请注意,在不使用多部分消息的情况下更改与消息关联的架构将需要断开“编排设计器”中的所有端口、发送和接收形状的连接,因此使用多部分消息可以避免此步骤。

有关更多信息,请访问本文参考部分中的链接“8 技巧和窍门,提高 BizTalk 编程效率”。

场景 2:在编排中接收 SOAP 消息(带有 SOAP 标头和 SOAP 正文),构建多部分消息并将其发送到 MessageBox 。一个 PO 消息(包含 PO 消息头的多部分消息)消耗程序从 MessageBox 中消耗此消息。

Multipart_example.jpg

其思想是创建使用 SOAP 消息的多部分消息。PO 消息(包含 PO 消息头的多部分消息)会将标头和正文作为两个独立的部分保存。

看看下面的编排

Multipart_odx.JPG

使用下面的代码行提取 SOAP 标头

soapHeader = POIn(WCF.InboundHeaders);

创建 PO 消息(包含 PO 消息头的多部分消息)

POEnv.Header_RoutingInfo = PORoutingInfo;
POEnv.Body_PO = POIn;

scenario2.JPG

设置出站消息的 SOAP 标头。

xmlDocument = PORoutingInfo;
POOut(WCF.OutboundCustomHeaders) = "<headers>" + xmlDocument.OuterXml + "</headers>";

WCF 不支持 BizTalk 多部分消息的原因是什么?

考虑一个到达 BizTalk Server 接收位置的 SOAP 请求。此 SOAP 请求包含 SOAP 标头和 SOAP 正文。SOAP 标头将包含由您的应用程序定义的自定义上下文。SOAP 正文通常是编排公开的架构。SOAP 适配器将 SOAP 请求拆分为 BizTalk 多部分消息,然后将其发送到 Message Box 的这种能力是一项非常有用的功能,可以节省大量开发工作。

另一方面,WCF 适配器根本不关心 SOAP 消息。如果您注意到了,当您想要将编排公开为 Web 服务时,“BizTalk WCF 服务发布向导”甚至不支持添加自定义标头。

有一种方法可以向 WCF 适配器生成的 WSDL 添加自定义标头。这超出了本文的范围。有关更多信息,请参阅 Yossi Dahan 在参考部分中的优秀帖子。

一些常见的陷阱

  1. 避免将编排参数定义为 XLANGMessage XLANGPart ,而是使用变量。
  2. 避免将 BizTalk 编排变量命名为“body”,因为它不会编译,因为“body”是保留字。

使用多部分消息时的常见编译错误

Error: Multi-part message has body part ‘xxx’, expected body part ‘yyy’.

为什么会发生这种情况?

当多部分消息首次在 BizTalk 编排视图中创建时,第一个创建的部分将自动成为消息正文部分,这意味着该部分属性“消息正文部分”将为“true”。考虑这种情况:您将属性“消息正文部分”更改为“false”并为其关联一个不同的架构,然后创建一个另一个消息正文部分,并将属性“消息正文部分”设置为 true 。请注意,BizTalk 会记住部分的创建顺序,其中第一个部分始终必须是消息正文部分。

如何解决?

当 BizTalk 多部分消息首次创建时,先关联消息正文部分的架构(它构成了多部分消息的 MessageType )。如果它们的创建顺序不正确,请删除多部分消息并重新创建。问题解决。

参考 - 不要错过这些精彩帖子

© . All rights reserved.