WCF初探-4:WCF消息交换模式之请求与答复模式

时间:2022-09-01 09:01:08

请求与答复模式( 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(10000);
            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寄宿程序寄宿该服务。添加客户端的服务引用:

 WCF初探-4:WCF消息交换模式之请求与答复模式

然后在客户端控制台程序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程序可以看到以下结果:

 WCF初探-4:WCF消息交换模式之请求与答复模式

我们可以看到服务器响应的时间刚好为10s,正好是线程休眠的时间,并且客户端返回了信息Hello WCF ,如果想要观察消息的变化,请参照WCF消息交换模式之单向模式中的WCF客户端测试程序使用方法,观察消息的变化。