BizTalk 2020的Receive.dll为何将XML消息包裹在带xmlns的string元素中
解决方案
你当前遇到的问题本质是两点:一是HTTP接收组件自动将请求内容序列化为WCF标准字符串格式,外层包裹了固定的<string>根节点;二是内部原始XML被做了HTML转义处理,<、>等符号被替换为转义字符,即便移除外层<string>节点,内部转义内容也无法被XML架构识别。
下面分优先级给出可落地的处理方案:
方案1:修改HTTP接收适配器配置(优先推荐,无需编码)
这是最省事的根解决方案,直接避免消息被封装和转义:
- 打开BizTalk管理控制台,找到对应接收位置的HTTP适配器配置
- 取消勾选以字符串形式传递请求正文类的选项(不同版本适配器选项名称略有差异,核心是不要让适配器把请求当成普通字符串序列化)
- 保存配置后重启接收位置,后续收到的消息就会是原始的Select格式XML,可直接被对应架构识别
方案2:自定义接收管道处理(次选,适合无法修改适配器配置的场景)
在接收管道的解码阶段完成消息预处理,比在业务流程处理性能更高、耦合度更低:
- 新建自定义接收管道组件,在
Execute方法中按以下逻辑处理消息流:- 读取完整消息流转换为字符串
- 调用
System.Web.HttpUtility.HtmlDecode()方法还原所有转义字符 - 加载为XML文档,使用XPath提取
/string节点的内部文本,即原始的Select XML内容 - 将处理后的XML重新转为流,重置流位置为0后返回
- 在接收管道的解码阶段加入该自定义组件,后续接XML反汇编器,指定你的Select消息对应的架构即可完成消息解析
方案3:修正业务流程内的处理逻辑(适合必须在流程内处理的场景)
你之前的操作遗漏了转义还原和MessageType属性配置的步骤,按以下方式修正:
- 接收原始消息后,先将整个消息内容读取为字符串,先执行HTML转义还原
- 加载还原后的内容为XML文档,提取内部的Select节点
- 将Select节点赋值给业务流程中对应类型的消息时,手动设置消息的上下文属性:
目标Message(BTS.MessageType) = "http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/MainData#Select"; - 确保该架构已经部署到当前BizTalk应用中,业务流程的接收端口对应消息类型匹配该架构
内容的提问来源于stack exchange,提问作者james treinen
相关产品推荐
相关产品推荐

