WCF系列教程之消息交换模式之请求与答复模式(Request/Reply)

1、使用WCF请求与答复模式须知

(1)、客户端调用WCF服务端需要等待服务端的返回,即使返回类型是void

(2)、相比Duplex来讲,这种模式强调的是客户端的被动接受,也就是说客户端接受到响应后,消息交换就结束了

(3)、在这种模式下,服务端永远是服务端,客户端就是客户端,职责分明。

(4)、它是缺省的消息交换模式,设置OperationContract便可以设置为此种消息交换模式

 

2、代码示例

服务层接口IReqReplyService.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace IService
{
    [ServiceContract]
    public interface IReqReplyService
    {
        [OperationContract]
        void HelloWorld(string name);
    }
}

服务层接口IReqReplyService.cs的实现类代码如下:

using IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Service
{
    public class ReqReplyService : IReqReplyService
    {
        public void HelloWorld(string name)
        {
            Thread.Sleep(6000);
        }
    }
}

修改宿主配置文件App.config如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Service.ReqReplyService" behaviorConfiguration="OneWayBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/ReqReplyService/"/>
          </baseAddresses>
        </host>

        <endpoint address="" binding="wsHttpBinding" contract="IService.IReqReplyService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
      </services>


    <behaviors>
      <serviceBehaviors>
        <behavior name="OneWayBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True"/>
          </behavior>
        </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

生成解决方案,开启宿主服务,并通过微软的svcutil工具生成ReqReplyService服务的客户端代理类,开始菜单/Microsoft Visual Studio 2012/Visual Studio Tools/Visual Studio 2012开发人员命令提示工具,定位到当前客户端l路径,输入命令:svcutil http://localhost:8000/ReqReplyService/?wsdl  /o:ReqReplyService.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();
        }
    }
}

我们可以看到服务器响应的时间刚好为6s,正好是线程休眠的时间,并且客户端返回了信息Hello WCF.

 

posted @ 2017-05-11 23:30  郑小超  阅读(853)  评论(0编辑  收藏  举报