按正文路由

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

在此示例中,客户端是一个控制台应用程序 (.exe),并且服务承载在 IIS 中。

备注

本主题的最后介绍了此示例的设置过程和生成说明。

此示例演示基于正文内容的消息调度。 内置的 Windows Communication Foundation (WCF) 服务模型消息调度机制是基于消息操作的。 不过,有许多现有的 Web 服务使用 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 均为空,这一事实对客户端节点没有影响,但自动生成的代理中的 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 示例的一次性安装过程

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

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