请求与答复模式( Request/Reply)
这种交换模式是使用最多的一中,它有如下特征:
- 调用服务方法后需要等待服务的消息返回,即便该方法返回 void 类型
- 相比Duplex来讲,这种模式强调的是客户端的被动接受,也就是说客户端接受到响应后,消息交换就结束了。
- 在这种模式下,服务端永远是服务端,客户端就是客户端,职责分明。
- 它是缺省的消息交换模式,设置OperationContract便可以设置为此种消息交换模式
接下来我们通过实例来演示一下,参照WCF消息交换模式之单向模式中的例子,我们将代码稍微做一下修改,将总个解决法案的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();
return "Hello "+name;
}
}
}
Host类库中的配置App.config代码如下:
<?xmlversion="1.0"?>
<configuration>
<system.serviceModel>
<services>
<servicename="Service.ReqReply"behaviorConfiguration="ReqReplyBehavior">
<host>
<baseAddresses>
<add baseAddress="http://127.0.0.1:1234/ReqReply/"/>
</baseAddresses>
</host> <endpoint address=""binding="wsHttpBinding" contract="Service.IReqReply"/>
<endpoint address="mex"binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services> <behaviors>
<serviceBehaviors>
<behaviorname="ReqReplyBehavior">
<serviceMetadatahttpGetEnabled="True"/>
<serviceDebugincludeExceptionDetailInFaults="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel> </configuration>
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消息交换模式之单向模式中的WCF客户端测试程序使用方法,观察消息的变化。