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的方法,实现了服务端向客户端的调用。
执行效果如下图所示:
四、代码下载:
五、版权
转载请注明出处:http://www.cnblogs.com/iamlilinfeng
WCF入门教程系列五的更多相关文章
- WCF入门教程(五)配置文件
WCF入门教程(五)配置文件 服务协定以及实现写好后,需要将相关服务公布出去,就需要HOST来承载,供客户端来调用. 承载服务有两种方式,一种通过配置文件,一种通过代码进行配置.上一章已经介绍了代码方 ...
- WCF入门教程系列一
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- WCF入门教程系列三
一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...
- WCF入门教程系列二
一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...
- WCF入门教程系列六
一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...
- WCF入门教程系列四
一.概述 配置也是WCF编程中的主要组成部分.在 以往的.net应用程序中,我们会把DBConn和一些动态加载类及变量写在配置文件里.但WCF有所不同.他指定向客户端公开的服务,包括服务的地址. 服务 ...
- WPF入门教程系列五——Window 介绍
一.窗体类基本概念 对于WPF应用程序,在Visual Studio和Expression Blend中,自定义的窗体均继承System.Windows.Window类.用户通过窗口与 Windows ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- WCF入门教程(二)如何创建WCF服务
WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...
随机推荐
- 【转】【C/C++】内存分配函数:malloc,calloc,realloc,_alloca
转自:http://www.cnblogs.com/particle/archive/2012/09/01/2667034.html#commentform malloc: 原型:extern voi ...
- debug连线指令
-當發現原本正常的連線突然斷線的,請用底下的指令debug 1.ifconfig (看看IPaddress) 2.wpa_clira stat (看看連線狀態) 3.如果是在連線中(wp ...
- django TypeError: 'module' object is not callable
原因:导入模块时直接把模块当函数使用 from rest_framework import reverse #import reverse module @api_view(("GET&qu ...
- css代码整理、收集
整理了一下之前用到过的css代码,实现一种效果或许有许多种写法,我这里整理了一下我个人认为兼容性比较好,结构比较简洁的代码……如有写得不对的地方敬请前辈们指点赐教一下,小弟不胜感激!此学习笔记是动态的 ...
- 用angularjs遇到的坑们
最近在用angularjs做一些东西,由于学艺不精,对angularjs了解不够,导致经常会不小心掉进一些自己挖的坑里(⊙_⊙),在这里记下来,谨防又踩. 1.angularjs ng-show no ...
- 现有有N个学生的数据记录,每个记录包括学号、姓名、三科成绩。 编写一个函数input,用来输入一个学生的数据记录。 编写一个函数print,打印一个学生的数据记录。 在主函数调用这两个函数,读取N条记录输入,再按要求输出。 N<100
#include <iostream> using namespace std; struct student {char num[100]; char name[100]; int ...
- hdu 2019
Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序. Input 输入数据包含多 ...
- Kafka笔记--监控系统KafkaOffsetMonitor
KafkaOffsetMonitor下载链接: http://download.csdn.net/detail/changong28/7930337github官方:https://github.co ...
- 如何在项目中使用gtest1.6
问题 gtest1.6版本的README里说该版本不支持make install,其意思就是说你没法通过make命令把gtest安装到/usr/local/lib之类的目录,所以你也没办法通过下面的命 ...
- IOS 解析XML文档
前段时间想找点事做,就是试着看能不能用豆瓣的API做点什么,于是就碰到了这个问题——XML解析. 老师还没讲,只能自己去查. XML文档解析主要有SAX和DOM两种模式,IOS上两种模式都可以用,这里 ...