WCF通信的3种模式

1.正常模式:客户端调取接口-》等待服务响应-》接受响应-》执行客户端后面代码(wcf服务有入参,有返回值)

2.数据报模式:客户端调取接口-》不等待响应,直接执行客户端后面代码(wcf服务有入参,无返回值)

3.双工模式:客户端调取接口-》服务端立刻回复介绍到请求-》服务端继续执行,客户端也继续执行-》服务端执行回调客户端回调函数,传递信息给客户端(wcf服务有入参,无返回值,但必须定义客户端回调函数)

上代码:

接口代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text; namespace WCFServerLib
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
[ServiceContract]
public interface IService1
{
/*
标记当前方法是一个请求响应方式
* 请求数据,客户端等待相应结果,再去执行下面代码
*/
[OperationContract]
string GetData(int value); /*
标记当前方法是一个数据报方法
* 请求数据过去,但不响应结果,客户端不用等待
*/
[OperationContract(IsOneWay=true)]
void WriteLog(string msg);
} }

实现代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text; namespace WCFServerLib
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
public class Service1 : IService1
{
public string GetData(int value)
{
System.Threading.Thread.Sleep();
return string.Format("接收到消息: {0}", value);
} public void WriteLog(string msg)
{
System.Threading.Thread.Sleep();
}
}
}

客户端调用代码

        private void button2_Click(object sender, EventArgs e)
{
//正常调用
Client.ServiceReference1.Service1Client ss = new ServiceReference1.Service1Client();
MessageBox.Show("调用前");
string str= ss.GetData();
MessageBox.Show(str);
} private void button3_Click(object sender, EventArgs e)
{
//数据报
Client.ServiceReference1.Service1Client ss = new ServiceReference1.Service1Client();
MessageBox.Show("调用前");
ss.WriteLog("");
MessageBox.Show("调用后"); }

双工通信方式

服务端代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel; namespace WCFServerLib
{
//定义双工通信:通信模型1.立即会返回数据。2.处理完成会再次返回数据,通过设定好的回调函数。
[ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(IResult))]
public interface IDuplex
{
//IsOneWay=true:双工通信
//双工通信不能有返回值
[OperationContract(IsOneWay=true)]
void Run(string msg);
} /// <summary>
/// 定义一个回调契约,供客户端实现它
/// </summary>
public interface IResult
{
[OperationContract(IsOneWay=true)]
void Reuslt(string msg);
} public class Duplex : IDuplex
{
IResult result;
public Duplex()
{
//从方法的操作上下文中获取到客户端传递过来的IResult这个接口的实现类对象
result = OperationContext.Current.GetCallbackChannel<IResult>();
}
public void Run(string msg)
{
//模拟5秒钟以后处理完成
System.Threading.Thread.Sleep();
result.Reuslt("处理完成"+msg);
}
}
}

客户端代码

        private void button1_Click(object sender, EventArgs e)
{
System.ServiceModel.InstanceContext ic = new InstanceContext(new CallBacks());
DuplexClient c = new DuplexClient(ic);
c.Run("--1--");//立即返回处理数据
MessageBox.Show("双工通信出来完毕");
}
} public class CallBacks : IDuplexCallback
{
/// <summary>
/// 双工通信回调方法
/// </summary>
/// <param name="msg"></param>
public void Reuslt(string msg)
{
MessageBox.Show(msg);
}
}

WCF的三种模式的更多相关文章

  1. git push :推送本地更改到远程仓库的三种模式

    摘要:由于在git push过程中,no-fast-forward 的push会被拒绝,如何解决git push失败的问题?这里面有三种方法,分别会形成merge形式的提交历史,线性形式的提交历史,覆 ...

  2. App开发三种模式

    APP开发三种模式 现在App开发的模式包含以下三种: Native App 原生开发AppWeb App 网页AppHybrid App 混合原生和Web技术开发的App 详细介绍: http:// ...

  3. [转]VMware Workstation网络连接的三种模式

    经常要使用VMWare Workstation来在本地测试不同的操作系统,以前也搞不清楚网络连接三种模式,最近看了几篇文章才算明白.现总结如下: 1. VMware Workstation的虚拟网络组 ...

  4. LVS三种模式配置及优点缺点比较

    目录: LVS三种模式配置 LVS 三种工作模式的优缺点比较 LVS三种模式配置 LVS三种(LVS-DR,LVS-NAT,LVS-TUN)模式的简要配置 LVS是什么: http://www.lin ...

  5. LVS三种模式配置及优点缺点比较 转

    LVS三种模式配置及优点缺点比较   作者:gzh0222,发布于2012-11-12,来源:CSDN   目录: LVS三种模式配置 LVS 三种工作模式的优缺点比较 LVS三种模式配置 LVS三种 ...

  6. MySQ binlog三种模式

    MySQ binlog三种模式及设置方法 1.1 Row Level  行模式 日志中会记录每一行数据被修改的形式,然后在slave端再对相同的数据进行修改 优点:在row level模式下,bin- ...

  7. delegate,notifucation,KVO三种模式实现通信的优缺点

             在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delega ...

  8. 辛星跟您玩转vim第一节之vim的下载与三种模式

    首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...

  9. VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT

    VMware虚拟机上网络连接(network type)的三种模式--bridged.host-only.NAT VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换 ...

随机推荐

  1. day35 02-Hibernate持久化对象状态及状态转换

    hibernate内置有一个c3p0,不用引入c3p0的jar包也行. 现在其实可以不用去创建表和实体类.因为hibernate可以自动帮我们生成.只要把映射建好了它就可以自动帮我们生成. 创建实体类 ...

  2. go 语言介绍

    特点1. 静态类型,编译开源语言 2. 脚本化的语法,支持多种编程范式(函数式,面向对象) 3. 原生,给力的并发支持并发编程 Go语言的优势: 1.脚本化的语法:开发效率高,容易上手 2.静态类型+ ...

  3. SQl Server 函数篇 数学函数,字符串函数,转换函数,时间日期函数

    数据库中的函数和c#中的函数很相似 按顺序来, 这里价格特别的 print  可以再消息栏里打印东西 数学函数 ceiling()  取上限   不在乎小数点后面有多大,直接忽略 floor()   ...

  4. SQL server2008无法收缩日志

    SQL server2008无法收缩日志,错误信息为: 1:由于最小日志空间要求,无法收缩日志文件 2:无法收缩日志文件 2 (XXX_log),因为该文件结尾的逻辑日志文件正在使用 描述: 用的是网 ...

  5. ARC100C Linear Approximation

    传送门 分析 这道题真的好水呀QwQ,想必大家都知道对于式子|x-2|+|x-3|x取什么值可以使式子结果最小,这道题也是这个原理,只需要将要额外减的1.2.3……提前减掉就行了. 代码 #inclu ...

  6. setex()

    设置值和有效期 $redis->setex($key, $expire, $value);//$expire,有效期,单位秒 相当于 SET key value//设置键值 EXPIRE key ...

  7. backstop无法访问

    解决方案:重新build代码,重新启动虚拟机.再等一会儿,就OK了.

  8. 形式化验证工具(PAT)Perterson Algorithm学习

    今天学习一下Perterson Algorithm. 这个算法是使用三个变量来实现并发程序的互斥性算法. 具体看一下代码: Peterson算法是一个实现互斥锁的并发程序设计算法,核心就是三个标志位是 ...

  9. SDUT 2107 图的深度遍历

    图的深度遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 请定一个无向图,顶点编号从0到 ...

  10. 操作系统 Linux ex1 note

    ctrl + alt + T 命令行 ctrl + alt + F7 ctrl + alt + F1-6 ls 列出所有文件 / 根目录 ~ /home/username cd 切换路径 . 当前目录 ...