一: 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的三种通信模式:请求响应模式、数据报模式和双工通讯模式的更多相关文章

  1. 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序

    在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...

  2. iOS——浅谈iOS中三种生成随机数方法

    ios 有如下三种随机数方法:

  3. 浅谈Floyd的三种用法 By cellur925

    Floyd大家可能第一时间想到的是他求多源最短路的n³算法.其实它还有另外两种算法的嘛qwq.写一发总结好了qwq. 一.多源最短路 放段代码跑,注意枚举顺序,用邻接矩阵存图.本质是一种动规. 复杂度 ...

  4. Open Interface Service WCF三种通信模式

    WCF三种通信模式 一.请求响应模式: 概念:客户端发送请求,一直等待服务端响应,在此期间处于等待(假死)状态:直到服务器响应,才能继续执行其他的操作: 即使返回值是void 也属于请求与答复模式. ...

  5. 一: WCF的服务端与客户端在通信时有三种模式:请求响应模式、数据报模式和双工通讯模式。

    说一下基本知识,  1.如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契约 2.要想将方法作为wcf服务方法发布给外部调用,则一定要加上    [Operatio ...

  6. 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)

    浅谈c#的三个高级参数ref out 和Params   c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...

  7. 【转】浅谈常用的几种web攻击方式

    浅谈常用的几种web攻击方式 一.Dos攻击(Denial of Service attack) 是一种针对服务器的能够让服务器呈现静止状态的攻击方式.有时候也加服务停止攻击或拒绝服务攻击.其原理就是 ...

  8. 浅谈Spring的两种配置容器

    浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41   作者:黄小鱼ZZZ     ...

  9. 浅谈Kotlin(三):类

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 已经学习了前 ...

随机推荐

  1. 已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7};把数组a与数组b ,对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2];最后输出数组b的元素。

    int[]a={3,4,5,6,7}; int[]b={1,2,3,4,5,6,7}; int[] arry=new int[7]; System.out.print("数组b[]={&qu ...

  2. 【故障处理】一次RAC故障处理过程

    [故障处理]一次RAC故障处理过程 1.1  故障环境介绍 项目 source db db 类型 2节点RAC db version 11.2.0.1.0 db 存储 ASM OS版本及kernel版 ...

  3. .NET笔记(一)

    物理路径 context.Server.MapPath() 获取DataTable的某个单元格的值 tb.Rows[i][j] 或 tb.Rows["某一行"]["某一列 ...

  4. tar, rar, unrar, zip, unzip

    tar 打包/解包/压缩/解压缩文件,注意打包和压缩不是一回事,打包相当于捆绑,压缩是在捆绑好后再把里面的空隙挤出以生成更小的文件 $tar [-zjxcvf] filename.tar[.gz... ...

  5. Android ImageView(scaleType属性)(转)

    (转自:http://www.open-open.com/lib/view/open1378257991687.html) <ImageView android:id="@+id/im ...

  6. jQuery 3.0 的变化

    时隔 3 个月,jQuery 团队终于发布了 3.0 Alpha 版本.有两个版本 jQuery compat 3.0 和 jQuery 3.0. jQuery compat 3.0 对应之前的 1. ...

  7. 怎么解决ZBrush保存历史记录太多问题

    经常有用户反映说ZBrush ®保存历史记录太多了,导致文件太大了!模型已经是降低级别保存了,在保存历史记录的时候还是很慢很慢,不知道怎么才能减少ZBrush保存的历史步骤的多少.针对这一问题,小编统 ...

  8. [转载]ExtJs4 笔记(12) Ext.toolbar.Toolbar 工具栏、Ext.toolbar.Paging 分页栏、Ext.ux.statusbar.StatusBar 状态栏

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  9. 通过Hander进行界面刷新

    Timer timer; TimerTask task; Handler handler;//先声明这3个变量 //在onCreate方法内 handler = new Handler(){ @Ove ...

  10. 平面直接坐标系线段相交问题(小Q(钟神)的问题)

    [问题描述] 小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在?轴正半轴和?轴正半轴分别挑选?个点.随后,他将 ...