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. 【总结整理】地理信息系统GIS的基础坐标知识

    关于辰青2018.03.31 1.地理坐标系和投影坐标系的区别 答案: 1.地理坐标系统是一种球面坐标,而投影坐标系统是平面坐标 2.投影坐标系统在二维平面上有恒定的长度.角度和面积 3.投影坐标系统 ...

  2. 精美3D中国象棋

    本人2013年的巅峰之作,现在已经完全免费放送.象棋界面的史诗革命.当前下载版本仅支持Windows 平台. 操作: 方向键的 上,下,左,右 控制棋盘翻转.Home 键回到初始状态,End按键回到平 ...

  3. Java50道经典习题-程序30 插入数字

    题目:有一个已经排好序的数组.现输入一个数,要求将它插入数组中后数组依然是排好序的.分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置. imp ...

  4. 【C#】EF学习<二> DbFirst (先创建数据库,表及其关联关系)

    工程压缩文件放到百度云盘---20181019001文件夹 1. 创建表的脚本 create table Teacher ( TID char(12) primary key, Tname char( ...

  5. w2008 R2 401 - 未授权: 由于凭据无效,访问被拒绝。

    1.打开服务器的"IIS信息服务管理器"-->选择你发布的网站-->选择功能视图中的"身份验证"-->右键匿名身份验证,选择"编辑& ...

  6. ASP.NET MVC底层原理与框架

    前言 鄙人有一毛病,喜欢钻研原理性的东西,感觉只知道怎么用还不太够,更想知道如何实现的以及为什么会这样. 暑假的时候做积分系统是第一次接触MVC,感觉MVC就是一个框架,分为Module ,view和 ...

  7. Appium的常用定位方法

    使用uiautomatorviewer.bat工具来找到属性定位元素,在SDK的tools目录下找到该工具,双击打开.左边框内展示app的界面元素,右上角框内展示元素的层级关系,右下角框内展示元素的属 ...

  8. 正经学C#_运算符优先级:[c#入门经典]

    学了那么多的运算符,终于差不多结束了,现在要说一下  总体的优先级别 高到低的顺序 类别  运算符  结合性  前缀 ++,--,(),+,-,!,~ 从左到右  乘除  * / %  从左到右  加 ...

  9. 在eclipse中使用hadoop插件

    我的配置环境看我的上篇博文. 配置过程: (1)把插件放到eclipse/plugins目录下.(我的版本上一篇也有) )重启eclipse,配置Hadoop installation directo ...

  10. Python 中 os.path 模块的运用

    官网文档链接: https://docs.python.org/3/library/os.path.html 概念: 该模块在路径名上实现了一些有用的功能,主要用于文件的属性获取 代码实现: os.p ...