WCF系列之WCF的通信模式

一、概述

WCF在通信过程中有三种模式:请求与答复、单向、双工通信。以下我们一一介绍。

二、请求与答复模式

描述:

客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,如下图所示(图中的粗红线在此时代表顺序并不代表调用):

请求与答复模式为WCF的默认模式,如下代码所示:

[OperationContract]
 string ShowName(string name);

即使返回值是void 也属于请求与答复模式。

缺点:如果用WCF在程序A中上传一个2G的文件,那么要想执行程序B也许就是几个小时后的事情了。如果操作需要很长的时间,那么客户端程序的响应能力将会大大的下降。

优点:有返回值我们就可以向客户端返回错误信息,如:只接收".rar"文件等信息。

实例:

//服务端接口
using System.ServiceModel;

namespace WCFService_Default
{
    [ServiceContract]
    public interface IUser
    {
        [OperationContract]
        string ShowName(string name);
    }
}
//服务端实现
namespace WCFService_Default
{
    public class User : IUser
    {
        public string ShowName(string name)
        {
            //线程睡眠20秒钟
            System.Threading.Thread.Sleep(20000);
            return "WCF服务,显示名称:" + name;
        }
    }
}

//客户端调用
using System;
using WCFClient_Default.WCFService_Default;

namespace WCFClient_Default
{
    class Program
    {
        static void Main(string[] args)
        {
            UserClient client = new UserClient();
            Console.WriteLine(DateTime.Now);
            string result = client.ShowName("李林峰");
            Console.WriteLine(result);
            Console.WriteLine(DateTime.Now);
            Console.ReadLine();
        }
    }
}

在上例中,我们在服务端让线程睡眠20秒然后再返回客户端,那么客户端两次显示当前时间的间隔必然在20秒以上,如下图所示:

二、单向模式

描述:

客户端向服务端发送求,但是不管服务端是否执行完成就接着执行下面的程序。如下图所示:

单向模式要在OpertaionContract的属性中显示设置值,代码如下:

[OperationContract(IsOneWay = true)]
void ShowName(string name);

优缺点与“请求响应模式”差不多倒过来。

特点:使用 IsOneWay=true 标记的操作不得声明输出参数、引用参数或返回值

实例:

//服务端接口
using System.ServiceModel;

namespace WCFService_OneWay
{
    [ServiceContract]
    public interface IUser
    {
        [OperationContract(IsOneWay = true)]
        void DoSomething();
    }
}

//服务端实现
namespace WCFService_OneWay
{
    public class User : IUser
    {
        public void DoSomething()
        {
            //线程睡眠20秒钟
            System.Threading.Thread.Sleep(20000);
        }
    }
}

//客户端调用
using System;
using WCFClient_OneWay.WCFService_OneWay;

namespace WCFClient_OneWay
{
    class Program
    {
        static void Main(string[] args)
        {
            UserClient client = new UserClient();
            Console.WriteLine(DateTime.Now);
            //调用WCF服务的方法
            client.DoSomething();
            Console.WriteLine(DateTime.Now);
            Console.ReadLine();
        }
    }
}

在单向模式中与请求响应模式最主要的就是加IsOneWay属性,运行效果如下:

三、双工模式

描述:

双工模式建立在上面两种模式的基础之上,实现客户端与服务端相互的调用。相互调用:以往我们只是在客户端调用服务端,然后服务端有返回值返回客户端,而相互调用不光是客户端调用服务端,而且服务端也可以调用客户端的方法。如下图所示:

在上图中,客户端的程序A调用服务端的程序A,服务程序A执行完成前又调用客户端的程序D,然后再返回到程序A,图有点乱,其实就是为了说明“服务端”与“客户端”可以相互调用,下面直接看代码。

如我们所说的,双工模式是建立在以上两种模式之上的模式,他们并不冲突,代码如下:

[ServiceContract(CallbackContract = typeof(IUserCallback))]
    public interface IUser
    {
        [OperationContract]
        string ShowName(string name);
    }
   //回调的接口
    public interface IUserCallback
    {
        [OperationContract(IsOneWay = true)]
        void PrintSomething(string str);
    }

实例:

支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我们这里用WSDualHttpBinding为例

//配置文件中的 binding 指定
<endpoint address=""  binding="wsDualHttpBinding" contract="WCFService_DualPlex.IUser"></endpoint>

//服务端接口
using System.ServiceModel;

namespace WCFService_DualPlex
{
    [ServiceContract(CallbackContract = typeof(IUserCallback))]
    public interface IUser
    {
        [OperationContract]
        string ShowName(string name);
    }

    public interface IUserCallback
    {
        [OperationContract(IsOneWay = true)]
        void PrintSomething(string str);
    }
}

//服务端实现
using System.ServiceModel;

namespace WCFService_DualPlex
{
    public class User : IUser
    {
        IUserCallback callback = null;

        public User()
        {
            callback = OperationContext.Current.GetCallbackChannel<IUserCallback>();
        }

        public string ShowName(string name)
        {
            //在服务器端定义字符串,调用客户端的方法向客户端打印
            string str = "服务器调用客户端...";
            callback.PrintSomething(str);
            //返回服务端方法
            return "WCF服务,显示名称:" + name;
        }
    }
}

//客户端调用
using System;
using System.ServiceModel;
using WCFClient_DualPlex.WCFService_DualPlex;

namespace WCFClient_DualPlex
{
    //实现服务端的回调接口
    public class CallbackHandler : IUserCallback
    {
        public void PrintSomething(string str)
        {
            Console.WriteLine(str);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
            UserClient client = new UserClient(instanceContext);
            Console.WriteLine(DateTime.Now);
            string result = client.ShowName("李林峰");
            Console.WriteLine(result);
            Console.WriteLine(DateTime.Now);
            Console.ReadLine();
        }
    }
}

在上例中,我们把接口定义在服务端,而实现在客户端,配置文件是由IDE自动生成的,我们在服务端ShowName方法中,调用了PringSomething的方法,实现了服务端向客户端的调用。

执行效果如下图所示:

四、代码下载:

10 WCF 教程

五、版权

转载请注明出处:http://www.cnblogs.com/iamlilinfeng

时间: 2024-10-16 00:36:16

WCF系列之WCF的通信模式的相关文章

[老老实实学WCF] 第十篇 消息通信模式(下) 双工

原文:[老老实实学WCF] 第十篇 消息通信模式(下) 双工 老老实实学WCF 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双工这种消息通信模式. 在一定程度上说,双工模式并不是与前面两种模式相提并论的模式,双工模式的配置方法同前两者不同,而且双工模式也是基于前面两种模式之上的. 在双工模式下,服务端和客户端都可以独立地调用对方,谁都不用等待谁的答复,同样也不期

WCF系列之WCF宿主

一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有"WCF 服务应用程序"和"WCF服务库". WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定义,可以直接看到运行的效果.此项目模板基于IIS托管的程序,如本系列的第一节所示.在开发基于IIS托管的WCF服务程序时,比较多见,自学的时候也可以使用这种类型,简单易懂. WCF服务库,可以认为是一个包含WCF服务以及契约定义的类库.不能直接运行,你可以在其他项目里引

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

1.使用WCF请求与答复模式须知 (1).客户端调用WCF服务端需要等待服务端的返回,即使返回类型是void (2).相比Duplex来讲,这种模式强调的是客户端的被动接受,也就是说客户端接受到响应后,消息交换就结束了 (3).在这种模式下,服务端永远是服务端,客户端就是客户端,职责分明. (4).它是缺省的消息交换模式,设置OperationContract便可以设置为此种消息交换模式 2.代码示例 服务层接口IReqReplyService.cs代码如下: using System; usi

WCF系列之WCF的配置文件

一.概述 配置也是WCF编程中的主要组成部分.在以往的.net应用程序中,我们会把DBConn和一些动态加载类及变量写在配置文件里.但WCF有所不同.他指定向客户端公开的服务,包括服务的地址.服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型等.使用配置文件后,我们无需编译即可修改WCF的变化的信息,提高了程序的灵活性. 如果在代码里写了配置,那么配置文件将不起作用. Web程序在Web.config中配置,应用程序中在App.config中配置. 二.服务配置的主要部分 在Conf

WCF系列之WCF服务调用方式

WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象进行服务调用. 通过SvcUtil.exe的方式调用服务 SvcUtil.exe是一个命令行工具,位于:C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin目录下,可以将SvcUtil.exe添加到VS2010中方便以后的运用,添加方式:在VS2010的Tools菜单中选择External T

wcf_消息通信模式(下) 双工通讯

原文:[老老实实学WCF] 第十篇 消息通信模式(下) 双工 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双工这种消息通信模式. 在一定程度上说,双工模式并不是与前面两种模式相提并论的模式,双工模式的配置方法同前两者不同,而且双工模式也是基于前面两种模式之上的. 在双工模式下,服务端和客户端都可以独立地调用对方,谁都不用等待谁的答复,同样也不期待对方答复,因为如

十五天精通WCF——第六天 你必须要了解的3种通信模式

wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦,单向,请求-响应,双工模式,其中的第二种“请求-响应“ 模式,这个大家不用动脑子都清楚,这一篇我大概来分析下. 一:“请求-响应“模式   如果你看了我上一篇的博文,你应该非常清楚这种类似“本地调用”的方式,wcf同样也分为“同步”和“异步”两种,不过不管是异步还是同步,最终都逃 不过是“请求-响应”这个事实,对吧. 1: 同步方式 这种方式我想没什么好说的,前面几篇我已经说的非常清楚了,具体使用方法可以参考我的

WCF系列之双工通信

WCF双工通信允许客户端调用服务器端,也允许通过回调,实现服务器端调用客户端,并不是所有的协议都支持双工通信,比如HTTP协议是不支持双工通信的. 我们来看一下契约的定义,其中在ServiceContract指定了CallbackContract,定义了ICalculateCallback,回调契约不需要指定为ServiceContract,但是方法要标记为OperationContract,可以看到服务契约和回调的方法均指定为IsOneWay=true,返回值都是void. 下一步,再来看一下

[老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端与客户端在通信时有三种模式:单向模式.请求/应答模式和双工模式. 如果选用了单向模式,调用方在向被调用方进行了调用后不期待任何回应,被调用方在执行完调用后不给调用方任何反馈.如客户端通过单向模式调用了一个服务端的操作后,就去干别的了,不会等待服务端给他任何响应,他也无从得知调用是否成功,甚至连发生了