请求与答复模式( Request/Reply)
这种交换模式是使用最多的一中,它有如下特征:
- 调用服务方法后需要等待服务的消息返回,即便该方法返回 void 类型
- 相比Duplex来讲,这种模式强调的是客户端的被动接受,也就是说客户端接受到响应后,消息交换就结束了。
- 在这种模式下,服务端永远是服务端,客户端就是客户端,职责分明。
- 它是缺省的消息交换模式,设置OperationContract便可以设置为此种消息交换模式
接下来我们通过实例来演示一下,参照中的例子,我们将代码稍微做一下修改,将总个解决法案的OneWay全部替换为ReqReply,替换后稍作修改,下面是各个类和接口的代码片段
服务接口IReqReply.cs代码如下:
using System.ServiceModel; namespace Service{ [ServiceContract] public interface IReqReply { [OperationContract] string SayHello(string name); }}
服务实现ReqReply.cs代码如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Service{ public class ReqReply:IReqReply { public string SayHello(string name) { System.Threading.Thread.Sleep(10000); return "Hello "+name; } }}
Host类库中的配置App.config代码如下:
Host类库中的配置Program.cs代码如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using Service; namespace Host{ class Program { static void Main(string[] args) { using (ServiceHost ReqReplyHost =new ServiceHost(typeof(ReqReply))) { ReqReplyHost.Opened += delegate { Console.WriteLine("请求响应通讯服务已经启动,按任意键终止!"); }; ReqReplyHost.Open(); Console.Read(); } } }}
整个解决方案工程结构没有变化,只是服务方法做了修改,通过休眠线程的时间和返回值来观察客户端对服务端调用的变化。编译程序后,我们运行Host.exe寄宿程序寄宿该服务。添加客户端的服务引用:
然后在客户端控制台程序Program.cs中添加如下代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Client.ReqReplyServiceRef; namespace Client{ class Program { static void Main(string[] args) { Console.WriteLine("****************请求响应通讯服务示例*******************"); ReqReplyClient proxy = newReqReplyClient(); Console.WriteLine("方法调用前时间:"+ System.DateTime.Now); Console.WriteLine(proxy.SayHello("WCF")); Console.WriteLine("方法调用后时间:" + System.DateTime.Now); Console.Read(); } }}
编译后运行Client.exe程序可以看到以下结果:
我们可以看到服务器响应的时间刚好为10s,正好是线程休眠的时间,并且客户端返回了信息Hello WCF ,如果想要观察消息的变化,请参照中的WCF客户端测试程序使用方法,观察消息的变化。