浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式
一: WCF的服务端与客户端在通信时有三种模式:请求响应模式、数据报模式和双工通讯模式。
说一下基本知识,
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(); 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(, )); 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(); string v = value.ToString(); } } //客户端调用(同上,我们用Winform测试) ServiceForOneWayClient OneWayClient = new ServiceForOneWayClient(); OneWayClient.GetData(); 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
如有错误,欢迎留言批评指正。
浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式的更多相关文章
- 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...
- iOS——浅谈iOS中三种生成随机数方法
ios 有如下三种随机数方法:
- 浅谈Floyd的三种用法 By cellur925
Floyd大家可能第一时间想到的是他求多源最短路的n³算法.其实它还有另外两种算法的嘛qwq.写一发总结好了qwq. 一.多源最短路 放段代码跑,注意枚举顺序,用邻接矩阵存图.本质是一种动规. 复杂度 ...
- Open Interface Service WCF三种通信模式
WCF三种通信模式 一.请求响应模式: 概念:客户端发送请求,一直等待服务端响应,在此期间处于等待(假死)状态:直到服务器响应,才能继续执行其他的操作: 即使返回值是void 也属于请求与答复模式. ...
- 一: WCF的服务端与客户端在通信时有三种模式:请求响应模式、数据报模式和双工通讯模式。
说一下基本知识, 1.如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契约 2.要想将方法作为wcf服务方法发布给外部调用,则一定要加上 [Operatio ...
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
浅谈c#的三个高级参数ref out 和Params c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...
- 【转】浅谈常用的几种web攻击方式
浅谈常用的几种web攻击方式 一.Dos攻击(Denial of Service attack) 是一种针对服务器的能够让服务器呈现静止状态的攻击方式.有时候也加服务停止攻击或拒绝服务攻击.其原理就是 ...
- 浅谈Spring的两种配置容器
浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41 作者:黄小鱼ZZZ ...
- 浅谈Kotlin(三):类
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 已经学习了前 ...
随机推荐
- 清理DBA_DATAPUMP_JOBS中的孤立数据泵作业
今天在重构数据库时(将表空间中的表.索引转移到其它表空间)时,发现有两个奇怪的对象SYS_EXPORT_FULL_01.SYS_EXPORT_FULL_02搜索了一下,发现这个可能是EXPDP导出异常 ...
- 正确的选择log级别
开发一个应用,日志的重要性不言而喻.然而有时会发现日志中会出现大量的垃圾日志.所谓垃圾日志,就是不需要知道的日志,或者这些日志对于应用查看.跟踪没有什么作用.也正是(但不仅仅是)出于这些问题的考量,常 ...
- 十五天精通WCF——终结篇 那些你需要注意的坑
终于一路走来,到了本系列的最后一篇了,这一篇也没什么好说的,整体知识框架已经在前面的系列文章中讲完了,wcf的配置众多,如果 不加一些指定配置,你可能会遇到一些灾难性的后果,快来一睹为快吧. 一: 第 ...
- 论Top与ROW_NUMBER读取第一页的效率问题
10.29 前一段时间研究关于分页的问题,由于数据库属于百万级的,考虑了关于优化方面的问题.其中一个考虑是:第一页展现的频率肯定是最高的,所以我想第一页就使用Top N来读取. 这个想法本身是没有错, ...
- Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法
Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法 You can extract all the ...
- Linux目录操作
mkdir() #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mod ...
- x01.Lab.OpenCV: 计算机视觉
横看成岭侧成峰,计算视觉大不同.观看的角度不同,成像自然不同,这对计算机视觉来说,是个大麻烦.但计算机视觉应用如此广泛,却又有不得不研究的理由.指纹机大家都用过吧,这不过是冰山之一角.产品检测,机器人 ...
- Idea15/16 配置Tomcat
1:我这里使用的是Eclipse创建的项目,导出后导入到Idea中使用 2:Idea导入Eclipse项目 3:Idea项目配置(默认快捷键CTRL+SHIT+ALT+S) 3.1 Project 项 ...
- 探究C语言中的前++和后++
小波带您探究c语言中的前++与后++: 欢迎吐槽,欢迎加QQ463431476. 欢迎关注! 现在来探究: 咱们先看第一个 i被赋值0,i++(后++)并没有输出1. 现在i被赋值0,++i,也 ...
- [麦先生]初学Laravel框架与ThinkPHP框架的不同(2)
在经过了一段时间的开发后,我对Laravel框架的认识又在逐步的加深,对于这个世界占有量NO.1的框架... 我想说,我已经在逐步的感受到他的恐怖之处... 一.建表--Laravel在数据库建表上 ...