浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式
2015-09-29 15:59
567 查看
一: WCF的服务端与客户端在通信时有三种模式:请求响应模式、数据报模式和双工通讯模式。
说一下基本知识,
1、如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契约
2、要想将方法作为wcf服务方法发布给外部调用,则一定要加上 [OperationContract]契约
3、实体类作为wcf方法参数或者返回值的话,则要贴上 [DataContract]
4、只有贴上了[DataMember]的属性才能作为wcf服务器方法参数值类传递,否则第三方调用者看不到此属性
二:请求响应模式:当客户端发出请求以后,一定要等待wcf服务的方法处理完成后才会响应给客户端,此过程中,客户端处于等待过程。如果服务端在处理大数据,很长的逻辑,执行耗时长,就不建议使用这种模式了。
实例:
上面我们让服务端线程挂起10秒,这个时候客户端只有等待10秒才能接收处理结果
三:数据报模式
要点:1.方法不能用返回值
2.在方法契约上加上[OperationContract(IsOneWay=true)]
数据报方法做的业务一般都是比较耗时的,一般分为如下类型:
1、长时间的数据库操作 ,比如海量表的拆分操作
2、长时间的IO操作,比如长时间的文件保存
实例
上例中:只要调用GetData方法,调用完毕会马上显示,因为是单向的数据报模式,从方法契约的命名参数IsOneWay=true我们就知道意思了。单向为true。但这样客户端就不知道服务器处理结果。
四:双工通讯模式
双工通讯wcf服务特点:
1、双工方法的返回值为void
2、方法必须为数据报方法
3、服务契约必须强制开启Session同时指定回调接口类型
4、配置文件中必须在终结点中指定绑定模式为双工通信模式,
支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我们这里用wsDualHttpBinding为例
实例:
上例中:客户端调用后,会在5秒后再次‘alert‘出我是服务器,我处理完成了!
上面例子都是利用线程的挂起来模拟大数据,复杂耗时的逻辑处理。
五:源码下载:WCFStudy
如有错误,欢迎留言批评指正。
说一下基本知识,
1、如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契约
2、要想将方法作为wcf服务方法发布给外部调用,则一定要加上 [OperationContract]契约
3、实体类作为wcf方法参数或者返回值的话,则要贴上 [DataContract]
4、只有贴上了[DataMember]的属性才能作为wcf服务器方法参数值类传递,否则第三方调用者看不到此属性
二:请求响应模式:当客户端发出请求以后,一定要等待wcf服务的方法处理完成后才会响应给客户端,此过程中,客户端处于等待过程。如果服务端在处理大数据,很长的逻辑,执行耗时长,就不建议使用这种模式了。
实例:
//服务端接口: [ServiceContract] public interface IWcfService { [OperationContract] string GetData(int value, int value2); } //服务端实现 public class WcfService : IWcfService { public string GetData(int value,int value2) { Thread.Sleep(10000); return string.Format("你输入的是: {0}", value + value2); } } 下面我们用一个控制台程序托管WCF服务(也可以用windows服务托管等) class StartService { static void Main() { using (ServiceHost host = new ServiceHost(typeof(WcfServiceLibrary.WcfService))) { host.Open(); Console.WriteLine("Wcf服务已启动,输入stop命令,停止服务!"); while (!Console.ReadLine().Equals("stop")) { Console.WriteLine("停止服务命令不正确!输入stop命令,停止服务!"); } host.Close(); Console.WriteLine("Wcf服务已停止!!!"); } Console.ReadKey(); } } //客户端调用(这里就用WinForm来测试) WcfServiceClient client = new WcfServiceClient(); MessageBox.Show(client.GetData(10, 15)); client.Close();
上面我们让服务端线程挂起10秒,这个时候客户端只有等待10秒才能接收处理结果
三:数据报模式
要点:1.方法不能用返回值
2.在方法契约上加上[OperationContract(IsOneWay=true)]
数据报方法做的业务一般都是比较耗时的,一般分为如下类型:
1、长时间的数据库操作 ,比如海量表的拆分操作
2、长时间的IO操作,比如长时间的文件保存
实例
//服务器端接口: [ServiceContract] public interface IServiceForOneWay { [OperationContract(IsOneWay=true)] void GetData(int value); } //服务器端实现: public class ServiceForOneWay : IServiceForOneWay { public void GetData(int value) { Thread.Sleep(5000); string v = value.ToString(); } } //客户端调用(同上,我们用Winform测试) ServiceForOneWayClient OneWayClient = new ServiceForOneWayClient(); OneWayClient.GetData(10); MessageBox.Show("调用完毕");
上例中:只要调用GetData方法,调用完毕会马上显示,因为是单向的数据报模式,从方法契约的命名参数IsOneWay=true我们就知道意思了。单向为true。但这样客户端就不知道服务器处理结果。
四:双工通讯模式
双工通讯wcf服务特点:
1、双工方法的返回值为void
2、方法必须为数据报方法
3、服务契约必须强制开启Session同时指定回调接口类型
4、配置文件中必须在终结点中指定绑定模式为双工通信模式,
支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我们这里用wsDualHttpBinding为例
实例:
1 //服务器端接口 2 3 [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IResult))] 4 5 public interface IServiceForwsDual 6 7 { 8 9 [OperationContract(IsOneWay = true)] 10 11 void GetData(string value); 12 13 } 14 15 /// <summary> 16 17 /// 回调接口,会被客户端的子类来实现 18 19 /// </summary> 20 21 public interface IResult 22 23 { 24 25 [OperationContract(IsOneWay = true)] 26 27 void DispalyResult(string result); 28 29 } 30 31 //服务器端实现: 32 33 /// <summary> 34 35 /// 在ServiceForwsDual构造函数中得到当前请求客户端的回调实例对象 36 37 /// </summary> 38 39 public class ServiceForwsDual : IServiceForwsDual 40 41 { 42 43 IResult result=null; 44 45 public ServiceForwsDual() 46 47 { 48 49 //获取当前客户端请求上下文中的回调接口具体实现类的对象 50 51 result = System.ServiceModel.OperationContext.Current.GetCallbackChannel<IResult>(); 52 53 } 54 55 public void GetData(string value) 56 57 { 58 59 System.Threading.Thread.Sleep(5000); 60 61 62 63 result.DispalyResult("我是服务器,我处理完成了!"); 64 65 } 66 67 } 68 69 //客户端调用: 70 71 //在代理客户端的构造函数中,传入第2步实现的回调接口的具体类对象 72 73 ServiceForwsDualClient wsDualClient = new ServiceForwsDualClient(new System.ServiceModel.InstanceContext(new DwsDualResult())); 74 75 wsDualClient.GetData("哈哈"); 76 77 MessageBox.Show("我是客户端,我处理完成了");
上例中:客户端调用后,会在5秒后再次‘alert‘出我是服务器,我处理完成了!
上面例子都是利用线程的挂起来模拟大数据,复杂耗时的逻辑处理。
五:源码下载:WCFStudy
如有错误,欢迎留言批评指正。
相关文章推荐
- magento获得支付方式
- 代理的阶段性小结
- 编写程序需要注意的细节(转自高手的总结)
- 20150917 Linux进程查看与管理以及作业管理
- hiho1234--Fractal(高精度)
- 国内常见的电子地图坐标介绍
- P14 (*) -P15 (**)Duplicate the elements of a list,Duplicate the elements of a list a given number of
- 关于2015年中一点小总结
- linux命令行练级攻略
- Oracle中rownum用法详解
- [动态规划]整数拆分(纯DP)
- 学会这6个好习惯,善待你的脖子?
- 在Ubuntu 12.04安装和设置Samba实现网上邻居共享
- Binary String Matching 5 (简单KMP模板题)
- HTTP协议
- CSS3盒模型display:box详解
- 终止所有nginx进程
- java web目录结构
- 在Ubuntu 12.04安装和设置SSH服务
- Android Bitmap 与 Drawable之间的区别和转换