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


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

     

    然后在客户端控制台程序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客户端测试程序使用方法,观察消息的变化。

  • 相关阅读:
    第三周作业
    第二周作业
    第一周作业
    预备作业3
    预备作业2
    预备作业01
    ## 20155336 2016-2017-2《JAVA程序设计》第十周学习总结
    20155336 2016-2017-2《JAVA程序设计》第九周学习总结
    ## 20155336 2016-2017-2《JAVA程序设计》第八周学习总结
    20155336 2016-2017-2《JAVA程序设计》第七周学习总结
  • 原文地址:https://www.cnblogs.com/linybo/p/13305733.html
Copyright © 2020-2023  润新知