说一下基本知识,

    1、如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契约

2、要想将方法作为wcf服务方法发布给外部调用,则一定要加上    [OperationContract]契约

3、实体类作为wcf方法参数或者返回值的话,则要贴上 [DataContract]

4、只有贴上了[DataMember]的属性才能作为wcf服务器方法参数值类传递,否则第三方调用者看不到此属性

二:请求响应模式:当客户端发出请求以后,一定要等待wcf服务的方法处理完成后才会响应给客户端,此过程中,客户端处于等待过程。如果服务端在处理大数据,很长的逻辑,执行耗时长,就不建议使用这种模式了。

实例:

 1 //服务端接口:
2
3 [ServiceContract]
4
5 public interface IWcfService
6
7 {
8
9 [OperationContract]
10
11 string GetData(int value, int value2);
12
13 }
14
15 //服务端实现
16
17 public class WcfService : IWcfService
18
19 {
20
21 public string GetData(int value,int value2)
22
23 {
24
25 Thread.Sleep(10000);
26
27 return string.Format("你输入的是: {0}", value + value2);
28
29 }
30
31 }
32
33 下面我们用一个控制台程序托管WCF服务(也可以用windows服务托管等)
34
35 class StartService
36
37 {
38
39 static void Main()
40
41 {
42
43 using (ServiceHost host = new ServiceHost(typeof(WcfServiceLibrary.WcfService)))
44
45 {
46
47 host.Open();
48
49 Console.WriteLine("Wcf服务已启动,输入stop命令,停止服务!");
50
51 while (!Console.ReadLine().Equals("stop"))
52
53 {
54
55 Console.WriteLine("停止服务命令不正确!输入stop命令,停止服务!");
56
57 }
58
59 host.Close();
60
61 Console.WriteLine("Wcf服务已停止!!!");
62
63 }
64
65 Console.ReadKey();
66
67 }
68
69 }
70
71 //客户端调用(这里就用WinForm来测试)
72
73   WcfServiceClient client = new WcfServiceClient();
74
75 MessageBox.Show(client.GetData(10, 15));
76
77 client.Close();

上面我们让服务端线程挂起10秒,这个时候客户端只有等待10秒才能接收处理结果

三:数据报模式

要点:1.方法不能用返回值

   2.在方法契约上加上[OperationContract(IsOneWay=true)]

数据报方法做的业务一般都是比较耗时的,一般分为如下类型:

    1、长时间的数据库操作 ,比如海量表的拆分操作

     2、长时间的IO操作,比如长时间的文件保存

实例

 1 //服务器端接口:
2
3 [ServiceContract]
4
5 public interface IServiceForOneWay
6
7 {
8
9 [OperationContract(IsOneWay=true)]
10
11 void GetData(int value);
12
13 }
14
15 //服务器端实现:
16
17 public class ServiceForOneWay : IServiceForOneWay
18
19 {
20
21 public void GetData(int value)
22
23 {
24
25 Thread.Sleep(5000);
26
27 string v = value.ToString();
28
29 }
30
31 }
32
33 //客户端调用(同上,我们用Winform测试)
34
35   ServiceForOneWayClient OneWayClient = new ServiceForOneWayClient();
36
37 OneWayClient.GetData(10);
38
39 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. 使用WebSocket实现服务端和客户端的通信

    开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...

  2. LinuxC语言实现服务端与客户端多进程通信

    链接:https://pan.baidu.com/s/1YDNIyTKAkh4E5x2dBeTgcQ 提取码:y35q 复制这段内容后打开百度网盘手机App,操作更方便哦 本实验用的是Centos7m ...

  3. socket系列之socket服务端与客户端如何通信

    上面已经分别介绍了ServerSocket跟Socket的工作步骤,并且从应用层往系统底层剖析其运作原理,我们清楚了他们各自的一块,现在我们将把他们结合起来,看看他们是如何通信的,并详细讨论一下他们之 ...

  4. 浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式

    一: WCF的服务端与客户端在通信时有三种模式:请求响应模式.数据报模式和双工通讯模式. 说一下基本知识,  1.如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契 ...

  5. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  6. WCF心跳判断服务端及客户端是否掉线并实现重连接

    WCF心跳判断服务端及客户端是否掉线并实现重连接 本篇文章将通过一个实例实现对WCF中针对服务端以及客户端是否掉线进行判断:若掉线时服务器或客户端又在线时将实现自动重连:将通过WCF的双工知识以及相应 ...

  7. C# 编写WCF简单的服务端与客户端

    http://www.wxzzz.com/1860.html Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Win ...

  8. 保持WCF服务端与客户端的长连接

    背景 客户端与服务端使用WCF建立连接后:1.可能长时间不对话(调用服务操作):2.客户端的网络不稳定. 为服务端与客户端两边都写“心跳检测”代码?不愿意. 解决 设置inactivityTimeou ...

  9. WCF开发的流程-服务端和客户端之间的通讯(内含demo讲解)

    讲解技术之前,恳请博友让我说几句废话.今天是我第一在博客园发布属于自己原创的博文(如有雷同,那是绝对不可能的事,嘿嘿).之前一直是拜读各位博友的大作,受益匪浅的我在这对博友们说声谢谢,谢谢你们的共享! ...

随机推荐

  1. 【ES】学习10-聚合3

    聚合是在查询匹配的文档中做统计的 不指定查询语句时,从所有文档中匹配. 下面两个语句等价: GET /cars/transactions/_search { , "aggs" : ...

  2. java 自动包装功能

    基本类型直接存储在堆栈中 基本类型所具有的包装容器,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型 基本类型与包装容器类对应如下:boolean Booleanbyte Byte short ...

  3. 常见的排序算法(直接插入&选择排序&二分查找排序)

    1.直接插入排序算法 源码: package com.DiYiZhang;/* 插入排序算法 * 如下进行的是插入,排序算法*/ public class InsertionSort {    pub ...

  4. Nginx详解二十九:基于Nginx的中间件架构设计

    基于Nginx的中间件架构 一:了解需求 1.定义Nginx在服务体系中的角色 1.静态资源服务 2.代理服务 3.动静分离 2.静态资源服务的功能设计 3.代理服务 二:设计评估 三:配置注意事项

  5. Go如何正确的使用mysql driver

    具体文章查看: https://xiequan.info/go%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E7%9A%84%E4%BD%BF%E7%94%A8mysql- ...

  6. javascript 将毫秒值转换为天-小时-分钟-秒钟

    var start_timeMS = new Date(start_date).getTime(); var end_timeMS = new Date(end_date).getTime(); va ...

  7. 论文阅读笔记三十二:YOLOv3: An Incremental Improvement

    论文源址:https://pjreddie.com/media/files/papers/YOLOv3.pdf 代码:https://github.com/qqwweee/keras-yolo3 摘要 ...

  8. 重新认识python

    为什么这样说呢,我几个月前就开始学python,但是一直都没有进步,还就只是会一些其它语言的共性的问题,也就是新学习的约等于0. 后来一直找一些适合自己的教材,通过同学找到了一个学长的教程. 开始了新 ...

  9. HDU5950 Recursive sequence (矩阵快速幂)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  10. 记录一次因代理Controller产生的404问题

    spring 3.2.4 为了给每一个controller配置一个拦截器链 import com.google.common.collect.Lists; import org.aopalliance ...