如何解决在 BizTalk Orchestration 中处理 SOAP 异常
我通过双向端口接收到一个soap FAULT消息,如下所示,
<S:Fault xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Status</faultcode>
<faultstring>Exception occured: TransactionRolledback</faultstring>
</S:Fault>
我收到的错误:只能使用此函数将“System.Exception”的对象类型添加到 ESB 故障消息中
我在使用 BTS.soap_envelope_1__1.Fault 的编排中使用单独的异常块,但仍然失败,
我想捕获这是 ESB 异常并发送到 ESB 门户。
解决方法
按照此 thread 答案中提供的步骤来捕捉肥皂错误。也建议在此处添加步骤
要将 SOAP 错误纳入您的编排:
-
在 BizTalk 中的发送端口上: a) WCF 适配器属性,消息选项卡:传播故障消息 = true b) WCF 适配器属性,消息选项卡:入站消息正文:使用“soap:Body”或使用提取消息的路径或 /*[local-name()='Fault'] 来获取 SOAP 错误 c) “为失败的消息启用路由” - 这对 SOAP 故障没有影响。因此,您可能希望将其设置为 true 以处理实际传输错误(非 SOAP 错误)。
-
在编排中的发送端口
- 选择操作,然后选择“新故障消息”
- 将消息名称设置为 SoapFault(或其他)
- 将消息类型设置为引用的架构:BTS.soap_envelope_1__2.Fault。 (如果这是 SOAP 1.1 操作,您将使用 BTS.soap_envelope_1__1.Fault)。
- 在发送操作的范围内
- 添加新的异常处理程序
- 为您在第 2 步中创建的 port-name.operation-name.SoapFault 选择“Exception Object Type”
- 指定对象名称,例如故障
- Fault 现在是 SOAP Fault 的 XML,您可以使用 XPath 来获取 Fault Reason 和 Message 元素。
现在,如果发生 SOAP 故障,则 BizTalk 跟踪的消息事件视图中不会显示“异常”——它只是表明您的业务流程收到了 SOAP 故障消息。但是在您的编排中,消息被视为异常,并且您的“SoapFault”异常处理程序被调用。你得到一个“FaultReceiveException”。
备注 1) 如果发生 SOAP 错误,BizTalk 发送端口传输重试选项不会生效,因为这不再被视为传输失败。这是不幸的,因为 SOAP 错误可能是由于目标服务的临时问题而发生的,并且重试请求可能会起作用。
2) 因为 BizTalk 不会将 SOAP 错误视为错误,所以如果您想使用失败消息的路由,您的业务流程需要记录该消息
3) 您仍然需要一个用于 XlangSoapException(即 System.Web.Services.Protocols.SoapException)和/或一般异常的异常处理程序,因为这些仍然会因传输错误(目标服务器停机等)而发生
-
由于 (3),您可能仍希望指定“为失败的邮件启用路由”以防止出现挂起的邮件。
-
在我的示例中,我刚刚收到了消息的 soap:Fault 部分,但如果需要,您可以选择整个 soap:Envelope。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。