Envelope必须设为true,否则XML Disassembler不识别信封;Body XPath须指向包裹多条消息的父节点(如/OrderBatch/body);多类型消息靠MessageType匹配,无需Schema内显式定义;SQL适配器Debatching依赖FOR XML的根容器结构。
这是最常踩的坑:光有带结构的XML,但没在Schema的节点上把Envelope属性设为Yes,整个消息会被当作普通XML原样传入MessageBox,不会拆包。BizTalk不靠文件名或内容猜信封,只认这个硬开关。
Envelope → 设为True
里有bts:Envelope="yes"(命名空间需引用xmlns:bts="http://schemas.microsoft.com/BizTalk/2003")很多人误以为Body XPath该填/Envelope或/root,结果一个消息都拆不出来。它真正的作用是告诉XML Disassembler:“从这个节点开始,下面每个同级子节点都算一条独立消息”。所以它必须指向一个**包裹多条消息的父记录**(比如或),而不是整个信封根。
... ... ... ,则Body XPath应设为/OrderBatch/body
你不需要在Envelope Schema里显式拖出RootA和RootB两个子记录来“容纳”不同类型消息。XML Disassembler只关心拆出来的每个片段的RootName + Namespace是否能匹配已部署的某个Schema的MessageType(即TargetNamespace#RootNodeName)。只要对应Schema已部署,类型自动识别。
和,只要这两个Namespace+Root名在GAC或BizTalkMgmtDb里有对应Schema即可代替具体子记录完全可行,甚至更灵活;关键不是结构,而是拆出来那段XML能
PurchaseOrder.xsd和Invoice.xsd → 拆出的消息变成UnknownMessage,进Failed Suspended队列当用SQL Receive Adapter拉取多行数据时,它默认会把结果集拼成单个XML发给Pipeline。这时能否Debatch,不取决于你有没有配Envelope Schema,而取决于SQL语句返回的XML是否满足信封结构要求 —— 即必须有明确的“外层包装”和“内层重复项”。
SELECT * FROM Orders FOR XML AUTO, ELEMENTS, ROOT('Orders') → 生成... ... ,此时配合Body XPath = '/Orders'就能拆SELECT * FROM Orders FOR XML RAW('Order'), ELEMENTS → 生成... ... ,没有根容器,XML Disassembler无法判定“哪里开始拆”,必须手动包一层信封不是语法糖,是BizTalk消息生命周期的分水岭:它决定了消息何时从“一个整体”变成“多个可并行处理的实例”。漏掉Envelope="yes",或写错Body XPath,等于没装引信——后面所有路由、升职、Orchestration都无从谈起。