BizTalk+ESB集成REST服务时自定义管道JSONDecoder失效及XML汇编器报错问题求助
看起来你在BizTalk+ESB集成REST服务的过程中遇到了两个关联的配置问题,我来帮你逐一梳理解决方案:
第一个问题:响应内容类型不匹配(JSON vs SOAP XML)
你最初碰到的错误:
"The content type application/json; charset=utf-8 of the response message does not match the content type of the binding (application/soap+xml; charset=utf-8)."
核心原因是选错了WCF绑定类型:WCF-BasicHttp是专门为SOAP服务设计的,它默认期望接收application/soap+xml格式的响应,但REST服务返回的是JSON格式,自然会出现内容类型不匹配的冲突。
正确的做法是使用WCF-WebHttp绑定,这是BizTalk专门为REST服务交互设计的适配器,原生支持JSON、XML等多种消息格式。你提到之前在Itinerary Service里找不到这个选项,大概率是以下两种情况:
- BizTalk环境未安装WCF-WebHttp适配器:打开BizTalk管理控制台,检查“适配器”节点下是否存在WCF-WebHttp,如果没有,需要重新运行BizTalk安装程序,勾选安装该适配器组件。
- Itinerary配置步骤有误:设计Itinerary时,添加服务端点后,要在Resolver配置中指定绑定类型为WCF-WebHttp;或者手动打开WCF配置编辑器,将绑定设置为
webHttpBinding,同时配置WebHttp行为,把默认响应格式设为JSON。
另外要注意响应管道的组件顺序:JSONDecoder必须放在XML Disassembler之前,这样才能先把JSON响应转换成BizTalk可识别的XML格式,再由XML Disassembler解析成业务消息。
第二个问题:XML汇编器报Envelope不匹配错误
换用WCF-BasicHttp后出现的错误:
"The document type "http://schemas.xmlsoap.org/soap/envelope/#Envelope" does not match any of the given schemas."
这个错误是因为WCF-BasicHttp会自动将REST服务的响应包裹在SOAP Envelope中,但你的Receive Location设置为读取消息Body,而XML汇编器期望的是你定义的业务文档结构,而非SOAP Envelope。
解决这个问题的根本方案还是换回WCF-WebHttp绑定,但如果因特殊原因必须使用WCF-BasicHttp,可以按以下步骤处理:
- 导入SOAP Envelope Schema:BizTalk默认没有自带该Schema,你需要手动创建或导入
http://schemas.xmlsoap.org/soap/envelope/对应的Schema文件。 - 配置XML汇编器:在接收管道的XML汇编器组件中,切换到“Envelopes”选项卡,添加你导入的SOAP Envelope Schema,同时设置“Body XPath”指向Envelope中的
/soap:Envelope/soap:Body/*(根据SOAP版本调整命名空间),让汇编器能正确从SOAP Envelope中提取业务消息体。
不过再次强调,这是适配SOAP绑定的妥协方案,REST服务的最佳实践还是用WCF-WebHttp绑定,能避免这些不必要的格式转换问题。
额外排查建议
- 先用Postman或curl测试你的REST服务,确认它返回的是纯JSON内容,没有SOAP包裹,排除服务端的格式问题。
- 检查请求管道的JSONEncoder配置:确保它设置的Content-Type是
application/json; charset=utf-8,让REST服务能正确识别请求格式。 - 确认响应管道的JSONDecoder组件配置:检查字符集是否为utf-8,且组件未被禁用、顺序无误。
备注:内容来源于stack exchange,提问作者James366

