【转】WCF入门教程五[WCF的通信模式]

一、概述

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

二、请求与答复模式

  描述:

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

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

1         [OperationContract]
2         string ShowName(string name);

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

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

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

  实例:

 1 //服务端接口
 2 using System.ServiceModel;
 3
 4 namespace WCFService_Default
 5 {
 6     [ServiceContract]
 7     public interface IUser
 8     {
 9         [OperationContract]
10         string ShowName(string name);
11     }
12 }
13 //服务端实现
14 namespace WCFService_Default
15 {
16     public class User : IUser
17     {
18         public string ShowName(string name)
19         {
20             //线程睡眠20秒钟
21             System.Threading.Thread.Sleep(20000);
22             return "WCF服务,显示名称:" + name;
23         }
24     }
25 }
26
27 //客户端调用
28 using System;
29 using WCFClient_Default.WCFService_Default;
30
31 namespace WCFClient_Default
32 {
33     class Program
34     {
35         static void Main(string[] args)
36         {
37             UserClient client = new UserClient();
38             Console.WriteLine(DateTime.Now);
39             string result = client.ShowName("李林峰");
40             Console.WriteLine(result);
41             Console.WriteLine(DateTime.Now);
42             Console.ReadLine();
43         }
44     }
45 }

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

二、单向模式

  描述:

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

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

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

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

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

  实例:

 1 //服务端接口
 2 using System.ServiceModel;
 3
 4 namespace WCFService_OneWay
 5 {
 6     [ServiceContract]
 7     public interface IUser
 8     {
 9         [OperationContract(IsOneWay = true)]
10         void DoSomething();
11     }
12 }
13
14 //服务端实现
15 namespace WCFService_OneWay
16 {
17     public class User : IUser
18     {
19         public void DoSomething()
20         {
21             //线程睡眠20秒钟
22             System.Threading.Thread.Sleep(20000);
23         }
24     }
25 }
26
27 //客户端调用
28 using System;
29 using WCFClient_OneWay.WCFService_OneWay;
30
31 namespace WCFClient_OneWay
32 {
33     class Program
34     {
35         static void Main(string[] args)
36         {
37             UserClient client = new UserClient();
38             Console.WriteLine(DateTime.Now);
39             //调用WCF服务的方法
40             client.DoSomething();
41             Console.WriteLine(DateTime.Now);
42             Console.ReadLine();
43         }
44     }
45 }

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

三、双工模式

  描述:

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

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

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

 1     [ServiceContract(CallbackContract = typeof(IUserCallback))]
 2     public interface IUser
 3     {
 4         [OperationContract]
 5         string ShowName(string name);
 6     }
 7    //回调的接口
 8     public interface IUserCallback
 9     {
10         [OperationContract(IsOneWay = true)]
11         void PrintSomething(string str);12     }

  实例:

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

 1 //配置文件中的 binding 指定
 2 <endpoint address=""  binding="wsDualHttpBinding" contract="WCFService_DualPlex.IUser"></endpoint>
 3
 4 //服务端接口
 5 using System.ServiceModel;
 6
 7 namespace WCFService_DualPlex
 8 {
 9     [ServiceContract(CallbackContract = typeof(IUserCallback))]
10     public interface IUser
11     {
12         [OperationContract]
13         string ShowName(string name);
14     }
15
16     public interface IUserCallback
17     {
18         [OperationContract(IsOneWay = true)]
19         void PrintSomething(string str);
20     }
21 }
22
23 //服务端实现
24 using System.ServiceModel;
25
26 namespace WCFService_DualPlex
27 {
28     public class User : IUser
29     {
30         IUserCallback callback = null;
31
32         public User()
33         {
34             callback = OperationContext.Current.GetCallbackChannel<IUserCallback>();
35         }
36
37         public string ShowName(string name)
38         {
39             //在服务器端定义字符串,调用客户端的方法向客户端打印
40             string str = "服务器调用客户端...";
41             callback.PrintSomething(str);
42             //返回服务端方法
43             return "WCF服务,显示名称:" + name;
44         }
45     }
46 }
47
48 //客户端调用
49 using System;
50 using System.ServiceModel;
51 using WCFClient_DualPlex.WCFService_DualPlex;
52
53 namespace WCFClient_DualPlex
54 {
55     //实现服务端的回调接口
56     public class CallbackHandler : IUserCallback
57     {
58         public void PrintSomething(string str)
59         {
60             Console.WriteLine(str);
61         }
62     }
63
64     class Program
65     {
66         static void Main(string[] args)
67         {
68             InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
69             UserClient client = new UserClient(instanceContext);
70             Console.WriteLine(DateTime.Now);
71             string result = client.ShowName("李林峰");
72             Console.WriteLine(result);
73             Console.WriteLine(DateTime.Now);
74             Console.ReadLine();
75         }
76     }
77 }

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

  执行效果如下图所示:

四、代码下载:

  10 WCF 教程

原文地址:http://www.cnblogs.com/iamlilinfeng/archive/2012/10/03/2710698.html

时间: 2024-12-28 21:57:49

【转】WCF入门教程五[WCF的通信模式]的相关文章

无废话WCF入门教程五[WCF的通信模式]

一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,如下图所示(图中的粗红线在此时代表顺序并不代表调用): 请求与答复模式为WCF的默认模式,如下代码所示: 1 [OperationContract] 2 string ShowName(string name); 即使返回值是void 也属于请求与答复模式. 缺点:

WCF入门教程:WCF基础知识问与答(转)

学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太少,直到现在,我也认为自己不过是初窥WCF的门径而已. 学以致用”,如果仅仅是希望能够在项目中合理地应用WCF,那么对于程序员而言,可以有两种选择,一种是“知其然而不知其所以然”,只要掌握了WCF的基础知识,那么对于一般的应用就足够了.要做到这一点就很容易了,微软秉承了一贯的方式,将WCF这门技术优雅地呈现给

WCF入门教程三[WCF的宿主]

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

无废话WCF入门教程三[WCF的宿主]

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

WCF入门教程1——WCF简要介绍

什么是WCF WindowsCommunication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有Http和Ftp的相关技术. 是Windows平台上开发分布式应用最佳的实践方式. WCF体系架构简介 契约与说明 契约定义消息系统的各个方面. 数据契约:服务中的参数: 消息契约:使用SOAP协议特定的消息部分

【转】WCF入门教程二[WCF应用的通信过程]

一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的对比图如下: WCF与其他分布式技术对比表 二.WCF中的 "A","B","C" 介绍 我们先看个生活中的例子,某一天,公司的领导让你去送一份合同文件,送文件的过程你可以选择的交通方式为"打车"."公交".&

WCF入门教程二[WCF应用的通信过程]

一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的对比图如下: WCF与其他分布式技术对比表 二.WCF中的 "A","B","C" 介绍 我们先看个生活中的例子,某一天,公司的领导让你去送一份合同文件,送文件的过程你可以选择的交通方式为“打车”.“公交”.“地铁”,当然费用是根据发票来报销的,到了

无废话WCF入门教程二[WCF应用的通信过程]

一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的对比图如下: WCF与其他分布式技术对比表 二.WCF中的 "A","B","C" 介绍 我们先看个生活中的例子,某一天,公司的领导让你去送一份合同文件,送文件的过程你可以选择的交通方式为“打车”.“公交”.“地铁”,当然费用是根据发票来报销的,到了

【转】WCF入门教程四[WCF的配置文件]

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