SOAP 路由是一个中间路由器,它可基于一组规则将 SOAP 消息从客户端转发到应用程序终结点。本示例使用 Windows Communication Foundation (WCF) 创建 SOAP 路由器。
提示
此示例需要安装 .NET Framework 3.5 版才能生成和运行。若要打开项目和解决方案文件,需要使用 Visual Studio 2008。
路由器使用 Windows Workflow Foundation (WF) 规则引擎实现核心路由器功能,以确定将给定消息转发到何处。本示例演示两个重要概念:如何在应用程序中一起使用 Windows Workflow Foundation 和 WCF 以及如何在工作流以外(也称为“独立”)使用 Windows Workflow Foundation 规则引擎。
提示
可以使用外部 RuleSet 工具包示例查看本示例中的规则。
提示
若要深入了解该路由器的 WCF 特性,请参阅 WCF Intermediary Router示例的文档。此示例使用基于规则的功能替换Intermediary Router示例中的路由器功能。
该示例包含四个项目:计算器服务、回显服务、路由器和客户端。在此示例中,计算器和回显服务都是标准的 WCF 服务,它们分别在 Calculator.cs 和 EchoService.cs 文件中定义。
路由器服务使用 WCF 扩展性处理消息和其他行为,例如处理传输模式(数据报/会话、请求-答复/双工)。
RouterTable.cs 源文件定义类,这些类利用 WF 规则引擎确定将从客户端接收的消息转发到何处。当路由器处理每个消息时,路由器将调用 RouterTable.SelectDestination()
以基于消息的内容获取要将消息转发到的终结点地址。
此时,RouterTable.cs 将运行 Selectdestination.Rules 中的 SelectDestination
规则集,以确定要将消息转发到哪个可能的终结点(计算器服务或回显服务)。
若要了解或编辑 SelectDestination
规则集,应当使用 .NET Framework 3.5 版 SDK 中的外部 RuleSet 工具包示例将其打开。
打开 SelectDestination 规则集
启动外部 RuleSet 工具包示例应用程序。
在**“数据”菜单中单击“导入”**。
在**“打开文件”**对话框中选择 router\SelectDestination.rules。
在规则集编辑器中单击**“SelectDestination”**规则集。
在**“选择工作流/类型”对话框中单击“浏览”**。
在打开文件对话框中,转到 router/bins 文件夹并单击 WCF_Router.Router.exe。
在**“Workflow/Type Selection”(选择工作流/类型)对话框的“Contained Types”(包含的类型)部分,单击“RoutingTable”,然后单击“OK”(确定)**。
在外部规则集工具包应用程序中,展开**“SelectDestination”,单击“Version 1.0”(版本 1.0),然后单击“Edit Rules”(编辑规则)**。
在外部规则集工具包中打开时,将显示**“SelectDestination”**规则集,如下图所示。
外部规则集工具包中的 SelectDestination 规则集
**“SelectDestination”**规则集中有六个规则。下面按照从最高优先级到最低优先级的顺序说明每个规则。
- 初始化变量:初始化
RouterTable
类中的变量,以便其余规则可以使用这些变量。 - CalculatorService:检查消息是否符合将消息转发到
CalculatorService
的条件(消息必须包含头“calculator”)。如果符合,则将CalculatorService
终结点添加到可以将消息转发到的可能终结点的列表。 - EchoService:检查消息是否符合将消息转发到
EchoService
的条件(消息必须包含操作消息头http://microsoft.servicemodel.samples/iechoservice/echo
)。如果符合,则将EchoService
终结点添加到可以将消息转发到的可能终结点的列表。 - 无匹配项:检查是否没有可以将消息转发到的可能终结点。如果为 true,则将此情况记录到控制台。
- 一个匹配项:检查是否只有一个可以将消息转发到的可能终结点。如果为 true,则将消息转发到此终结点。
- 多个匹配项:检查是否具有多个可以将消息转发到的可能终结点。如果为 true,则将消息转发到从可能终结点的列表中随机选择的终结点。
请注意,此规则集对 Windows Workflow Foundation 规则使用 .NET Framework 3.5 功能:可以使用 new 关键字调用类的构造函数。例如,在 CalculatorService
规则中,如果消息符合条件,则规则会向可能地址的列表中添加新的 EndpointAddress
。
运行示例时,操作请求和响应将显示在客户端控制台窗口中。在客户端窗口中按 Enter 可以关闭客户端。
Echo("Is anyone there?") returned: Is anyone there?
Add(5) returned: 5
Add(-3) returned: 2
生成并运行此示例
若要用单机配置或跨计算机配置来运行示例,请按照Running the Windows Communication Foundation Samples中的说明进行操作,但存在下面的例外:
- 在单一计算机和跨计算机配置中,需要四个项目和四个可执行文件 - 一个用于客户端,一个用于 SOAP 路由器,另外两个分别用于每个应用程序服务。
- 在跨计算机配置中,必须对四个配置文件进行以下更改:
- 更改
CalculatorService
和EchoService
的 App.config 文件的第 21 行。必须用中介的实际主机名替换localhost
主机名。 - 更改路由器的 App.config 文件的第 16 行。将两个地址(用“|”隔开)分别更改为
EchoService
和CalculatorService
的主机名。 - 更改客户端的 App.config 文件的第 5 行和第 7 行。必须用中介的实际主机名替换
localhost
主机名。 - 还可以在两个应用程序服务上运行 ServiceModel Metadata Utility Tool (Svcutil.exe)(当它们更新为使用正确的地址后)并重新生成 App.config 文件。
在启动客户端之前,请确保路由器、
EchoService
和CalculatorService
都在运行。三个服务都输出它们在启动时侦听的终结点地址。提示
EchoService
和CalculatorService
应用程序终结点使用路由器的地址。运行客户端。客户端首先联系
EchoService
,然后联系CalculatorService
。路由器在两个方向都显示它所转发的消息的 WS-Addressing 操作。提示
如果 Client.exe 和 Router.exe 在不同的计算机上,请在 Client.exe.config 中取消注释
<identity/>
一节,并将用户主体名称设置为正在运行 Router.exe 的用户的主体名称。