向端口添加故障消息时出现 Biztalk 错误 X2065

Biztalk error X2065 when adding fault message to port

我正在尝试处理编排中 API 的故障。

我创建了一个模式,看起来像我从 API 得到的 xml-fault,然后我使用该模式向端口的操作添加了一个错误消息。

想法是让一个发送端口订阅所有消息并将它们保存到一个文件夹中。

但是,当我尝试编译我的 BizTalk 业务流程时,出现错误: “错误 X2065:'response' 消息类型必须有一个 'body' 部分不同于任何 'fault' 消息类型 'body' 部分”

用谷歌搜索这个错误我一无所获,所以现在我很困惑。

响应xml:

<response>
  <result>
    <case_number>case_number_0</case_number>
    <table_sys_id>table_sys_id_0</table_sys_id>
    <table_name>table_name_0</table_name>
    <status>status_0</status>
  </result>
</response>

错误xml:

<response>
  <error>
    <detail>detail_0</detail>
    <message>message_0</message>
  </error>
  <status>status_0</status>
</response>

是否可以解决这个问题,或者我应该制作一个包含两种结构的模式,然后在编排中将其分开?我无法更改 API 的回复,就是这样。

这基本上是在告诉您您的根元素或名称空间在错误响应中必须不同。

您调用的 API 是否真的发回了非 200 系列 HTTP 错误?如果不是,那么它将简单地返回到逻辑端口的响应部分,你只需要一个 XPath 表达式来查看它是错误还是结果,或者有一个映射来创建一个有效负载,添加这些节点的计数,并有一个基于此的 If 形状。

如果 API 实际上给出了 400 或 500 系列错误,它将作为 SOAP 错误抛出,这就是您需要的架构(开箱即用)

注意:WCF-WebHttp 适配器存在已知错误(或至少在某些版本的 BizTalk 上,我将验证 BizTalk 2020 中是否仍然存在)

详情来自我的博客BizTalk 2013 R2 known bugs, issues & quirks

BUG: BIZTALK WCF-WEBHTTP ADAPTER DOES NOT SET THE MESSAGE TYPE ON ERROR

Details: When you get a non 200 series http status code from a RESTful service using the WCF-WebHttp adapter, the SOAP fault message published to the message box does not have the context property MessageType. This means you cannot map it or catch it in a Fault on the Logical Port in the Orchestration

Work around: Catch it in a System.Exception block in the Orchestration, see (BizTalk 2013 R2 JSON Encoder error – “Object reference not set to an instance of an object” – Part 1) or use BRE rules in a Pipeline to handle the SOAP Exception see BizTalk 2013 R2 JSON Encoder error – “Object reference not set to an instance of an object” – Part 2