高级错误处理

此示例演示 Windows Communication Foundation (WCF) 路由服务。路由服务是一个 WCF 组件,使用该组件可方便地在应用程序中包含基于内容的路由器。此示例使用事务和其他更加复杂的消息传递概念(如多播)演示如何智能地将路由服务从错误中恢复过来。

Ee667251.Important(zh-cn,VS.100).gif 注意:
您的计算机上可能已安装这些示例。在继续操作之前,请先检查以下(默认)目录:

<安装驱动器>:\WF_WCF_Samples

如果此目录不存在,请访问针对 .NET Framework 4 的 Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF) 示例(可能为英文网页),下载所有 Windows Communication Foundation (WCF) 和 WF 示例。此示例位于以下目录:

<安装驱动器>:\WF_WCF_Samples\WCF\Basic\RoutingServices\AdvancedErrorHandling

示例详细信息

在此示例中,路由服务配置为从 MSMQ 队列读取一个消息并将此消息多播到两个队列列表。一个列表用于服务队列,另一个用于日志记录队列。

因为在默认情况下,为路由服务配置的 MSMQ 绑定支持使用事务,所以路由服务可确保在向入站队列 (InQ) 报告消息已成功路由之前,消息是事务性的且由每个列表中的至少一个队列接收。因此,在两个服务队列或两个日志记录队列都不可用时,路由服务报告消息无法路由,入站队列应采取某种操作。此操作包含将消息移动至系统死信队列。

使用此示例

  1. Ee667251.Important(zh-cn,VS.100).gif 注意:
    在运行此示例之前安装 MSMQ。如果未安装 MSMQ,会在运行该示例时返回异常消息。在安装消息队列 (MSMQ)(可能为英文网页)上,可以找到有关安装 MSMQ 的说明。

    使用 Visual Studio 2010 打开 AdvancedErrorHandling.sln。

  2. 在 Visual Studio 中按 F5 或 F6****。

    1. 如果使用 F6 生成应用程序,则必须用 ./RoutingService/bin/debug/RoutingService.exe 启动应用程序。
  3. 在控制台窗口中,按 Enter 启动客户端。

  4. 客户端针对每种情况返回不同的有关队列的统计信息。

    1. 下面是针对情况 1(无故障)返回的输出。

      入站队列有 0 个消息。
      主服务队列有 1 个消息。
      备份服务队列有 0 个消息。
      主日志记录队列有 1 个消息。
      备份日志记录队列有 0 个消息。
      按 <Enter> 继续

    2. 下面是针对情况 3(主服务和日志记录队列故障)返回的输出。

      入站队列有 0 个消息。
      主服务队列不存在。
      备份服务队列有 1 个消息。
      主日志记录队列不存在。
      备份日志记录队列有 1 个消息。
      按 <Enter> 继续。

    3. 下面是针对情况 4(主服务队列以及主和备份日志记录队列故障)返回的输出。

      入站队列有 0 个消息。
      主服务队列不存在。
      备份服务队列有 0 个消息。
      主日志记录队列不存在。
      备份日志记录队列不存在。
      系统死信队列有 1 个消息。
      按 <Enter> 退出。

    4. 下面是针对情况 2(主服务队列故障)返回的输出。

      入站队列有 0 个消息。
      主服务队列不存在。
      备份服务队列有 1 个消息。
      主日志记录队列有 1 个消息。
      备份日志记录队列有 0 个消息。
      按 <Enter> 继续。

可通过代码或 App.config 配置

所提供的示例配置为使用 App.config 文件来定义路由器行为。还可以将 RoutingService\App.config 文件的名称更改为其他名称,使之无法识别,并在 RoutingService\Program.cs 中将 configDriven 字段的值更改为 false,以便使用代码中定义的配置。以上任一方法都可产生相同的路由器行为。

方案

此示例演示路由服务可以处理高级消息传递功能(如事务和接收上下文),并且可以将这些功能用作正确处理错误方案的一部分。

实际方案

Contoso 希望通过路由服务利用事务性接收,以确保即使在出现错误的情况下,所有必要服务也可接收信息。此外,还希望在无法传递消息时,即使利用错误处理逻辑,也可自动地正确处理错误并报告失败。为此,将路由服务配置为按预期方式故障转移到特定终结点,并且路由服务处理错误情况,具体包括根据需要创建、完成和回滚/中止事务/接收上下文。