BizTalk Server 2006/2009/2010 异常处理开发者指南






4.67/5 (13投票s)
本文解释了如何在 BizTalk 编排中处理异常。
引言
我们大多数人可能都曾用某种编程语言编写过异常处理代码。在 BizTalk 中,异常处理方式略有不同。本文将解释如何在 BizTalk 中使用端口处理异常和通知机制。
为什么需要处理异常?
考虑以下情况:
- 当 BizTalk 发送端口无法将消息传输到远程服务器时会发生什么?
- 有没有一种方法可以在 BizTalk 业务流程中重试事务,或者无限次重试直到远程服务器准备好接收消息?
- 当发生异常时,有没有一种方法可以优雅地终止业务流程?
- 如果发生异常,您将如何通过电子邮件通知 BizTalk 管理员?
BizTalk 业务流程中如何处理异常?
异常是指中断正常操作流程的异常情况。
BizTalk 中的作用域形状用于处理异常。BizTalk 业务流程中有两种异常:
- 异常(常规 .NET 异常)
- 一般异常
BizTalk 业务流程中的异常使用“作用域”形状进行处理。您必须将所有需要处理异常的逻辑放置在作用域形状内。作用域形状定义了一个异常部分,可以在其中优雅地处理异常。
需要将作用域的事务类型属性设置为“none
”。这样可以避免事务的开销,但仍能处理异常。
异常和一般异常有什么区别?

当我们创建一个新的异常处理程序时,请注意在“异常对象类型”属性中,列表中唯一的项目是“一般异常”。BizTalk 中的一般异常类似于编写 `try`-`catch` 块,但没有异常对象,这意味着无法获取异常对象。一般异常允许 BizTalk 处理它可能捕获和重新抛出的任何异常,但在那一刻无法获取异常消息。
“异常”是派生自 .NET 异常对象的异常。使用此异常对象类型,可以获取 `Exception` 对象及其相应的属性。请注意 `Exception` 类型的“异常对象名称”属性。这在一般异常的情况下将不存在。
异常与传递通知
传递通知是一个属性,用于指示发送端口适配器将把传递通知发送回业务流程,以指示消息已成功传输。
发送端口上的“传递通知”标志表示,如果消息未传输到目的地,业务流程必须收到通知。
需要注意的是,传递通知仅在发送端口上的“重试计数”属性设置为 `0` 时才有效。
传递失败异常详情
当消息无法通过 `DeliveryNotification` 属性设置为“`Transmitted`”的发送端口传递时,将引发 `DeliveryFailureException`,并且业务流程需要处理该异常。当您启用传递通知时,业务流程将在消息传输后等待 ACK/NACK 返回。如果返回 ACK,业务流程将完成范围形状并继续处理。如果引擎发回 NACK,则业务流程将引发 `Microsoft.XLANGs.BaseTypes.DeliveryFailureException`,这就是为什么代码需要捕获此类异常的原因。
场景 1:发送销售报告
考虑一个需要将销售报告上传到 Web 服务的场景。
假设
- 如果 Web 服务没有响应,它将在 24 小时后才能恢复在线。
- Web 服务端口上的重试计数和间隔设置为“
0
”。
如果 Web 服务没有响应,将引发异常,并通过将消息发送到 `Offline` 文件夹来处理。
![]() |
|
事件日志消息...
观察事件日志消息...
场景 2:使用虚拟文件夹引发“DeliveryFailureException”
在此场景中,当需要传输消息时,我们创建了一个“Dummy”文件夹,由于该Dummy文件夹不存在,我们处理异常并将消息发送到`Offline`文件夹。
事件日志消息
观察事件日志消息
关于可下载代码
- 将 Web 服务及其文件夹名称解压到 C:\inetput\wwwroot 目录中,然后设置 Web 服务。
注意 - 将 Persist.asmx 重命名为 Persist2.asmx,使其不可用。 - 将 BizTalk 项目 zip 文件及其文件夹名称解压到 C:\ 驱动器中。
- KeyAndBindings 文件夹包含 Bindings.xml 文件,可在解决方案构建和部署后导入。
- 将 SalesMessage 放置在 In 文件夹中,并检查 Offline 文件夹。
一些要点
- 如果您想处理 `exceptions`,请将 `Scope` 形状上的 `Synchronized` 属性设置为 `true`。
- 在业务流程中创建“Web 端口”时,始终选择添加到项目中的“Web 引用”所创建的“
WebPortType
”。 - 提前绑定端口不支持传递通知。建议不要使用提前绑定端口。仅将提前绑定端口用于学习和培训目的。