按正文路由

RouteByBody 示例演示如何实现一个服务,该服务接受具有任何 SOAP 动作的消息对象。 此示例基于《入门指南》,实现了计算器服务。 该服务实现一个Calculate操作,该操作接受Message请求参数并返回Message响应。

在此示例中,客户端是控制台应用程序(.exe),服务托管在 IIS 中。

注释

本示例的设置过程和生成说明位于本主题末尾。

此示例演示基于正文内容的消息调度。 内置的 Windows Communication Foundation (WCF) 服务模型消息调度机制是基于消息操作的。 但是,许多现有的网络服务使用 Action="" 来定义其所有操作。 不可能基于 WSDL 生成基于 Action 信息调度请求消息的服务。 此示例演示基于 WSDL 的服务协定(WSDL 包含在示例中包含的 Service.wsdl 中)。 该服务协定为计算器,与入门指南中使用的计算器相似。 然而,[OperationContract] 为所有操作指定了Action=""

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples"),
                 XmlSerializerFormat, DispatchByBodyBehavior]
    public interface ICalculator
    {
        [OperationContract(Action="")]
        double Add(double n1, double n2);
        [OperationContract(Action = "")]
        double Subtract(double n1, double n2);
        [OperationContract(Action = "")]
        double Multiply(double n1, double n2);
        [OperationContract(Action = "")]
        double Divide(double n1, double n2);
    }

在约定合同的情况下,服务需要自定义调度行为DispatchByBodyBehavior,以允许在操作之间调度消息。 该调度行为初始化 DispatchByBodyElementOperationSelector 自定义操作选择器,此选择器具有由各自的包装元素的 QName 进行键控的操作名称表。 DispatchByBodyElementOperationSelector 在正文第一个子级的开始标记中查找,并使用前面提到的表选择操作。

客户端使用从 WSDL 自动生成的代理,该 WSDL 是由使用 ServiceModel 元数据实用工具 (Svcutil.exe) 的服务导出的。

svcutil.exe  /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples /uxs http://localhost/servicemodelsamples/service.svc?wsdl /out:generatedProxy.cs

虽然所有操作的动作都是空的,但这对客户端代码没有影响,只对自动生成的代理中的 Action 参数有影响。

客户端代码执行多个计算。 运行示例时,操作请求和响应将显示在客户端控制台窗口中。 在客户端窗口中按 Enter 关闭客户端。

Add(100, 15.99) = 115.99
Subtract(145, 76.54) = 68.46
Multiply(9, 81.25) = 731.25
Divide(22, 7) = 3.14285714285714

Press <ENTER> to terminate client.

设置、生成和运行示例

  1. 确保已为 Windows Communication Foundation 示例 执行One-Time 安装过程。

  2. 要生成解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。

  3. 若要在单台计算机或跨计算机配置中运行示例,请按照 运行 Windows Communication Foundation 示例中的说明进行操作。