WCF的三种模式
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的三种模式的更多相关文章
- git push :推送本地更改到远程仓库的三种模式
摘要:由于在git push过程中,no-fast-forward 的push会被拒绝,如何解决git push失败的问题?这里面有三种方法,分别会形成merge形式的提交历史,线性形式的提交历史,覆 ...
- App开发三种模式
APP开发三种模式 现在App开发的模式包含以下三种: Native App 原生开发AppWeb App 网页AppHybrid App 混合原生和Web技术开发的App 详细介绍: http:// ...
- [转]VMware Workstation网络连接的三种模式
经常要使用VMWare Workstation来在本地测试不同的操作系统,以前也搞不清楚网络连接三种模式,最近看了几篇文章才算明白.现总结如下: 1. VMware Workstation的虚拟网络组 ...
- LVS三种模式配置及优点缺点比较
目录: LVS三种模式配置 LVS 三种工作模式的优缺点比较 LVS三种模式配置 LVS三种(LVS-DR,LVS-NAT,LVS-TUN)模式的简要配置 LVS是什么: http://www.lin ...
- LVS三种模式配置及优点缺点比较 转
LVS三种模式配置及优点缺点比较 作者:gzh0222,发布于2012-11-12,来源:CSDN 目录: LVS三种模式配置 LVS 三种工作模式的优缺点比较 LVS三种模式配置 LVS三种 ...
- MySQ binlog三种模式
MySQ binlog三种模式及设置方法 1.1 Row Level 行模式 日志中会记录每一行数据被修改的形式,然后在slave端再对相同的数据进行修改 优点:在row level模式下,bin- ...
- delegate,notifucation,KVO三种模式实现通信的优缺点
在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delega ...
- 辛星跟您玩转vim第一节之vim的下载与三种模式
首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...
- VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
VMware虚拟机上网络连接(network type)的三种模式--bridged.host-only.NAT VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换 ...
随机推荐
- ld 链接选项-L,-rpath-link,-rpath
转载自:http://blog.csdn.net/q1302182594/article/details/42102961 1. 三个C文件 1. world.c #include<stdio. ...
- Android 菜单之子菜单SubMenu
子菜单就是在点击了菜单中的选项后弹出的要对菜单中选项操作的菜单 他的操作与之前的两种类型的菜单操作差不多 动态添加 @Override public boolean onCreat ...
- Win提权思路,方法,工具(小总结)[转]
Win提权思路,方法,工具(小总结)[转] 看到这个文章,感觉整理的不错,就收藏下了. 介绍 windows提权总是被归结为适当的枚举.但要完成适当的枚举,你需要知道要检查和查找的内容.这通常需要伴随 ...
- Python入门:模拟登录(二)或注册之requests处理带token请求
转自http://blog.csdn.net/foryouslgme/article/details/51822209 首先说一下使用Python模拟登录或注册时,对于带token的页面怎么登录注册模 ...
- [译]Javascript中的循环
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- ObjectARX杂碎--(学习指南及书籍)
---------------------------------------------------------------------------------------------------- ...
- Vue属性绑定
v-bind:属性动态绑定数据,简写: v-html:绑定html代码 {{}}:绑定数据,另一种v-text v-bind:class="{‘red’:isActive}" : ...
- 割点(Tarjan算法)【转载】
本文转自:www.cnblogs.com/collectionne/p/6847240.html 供大家学习 前言:之前翻译过一篇英文的关于割点的文章(英文原文.翻译),但是自己还有一些不明白的地方, ...
- charles 抓取app端 https 请求
测试需要抓取app的https请求链接,百度了一下教程,能设置的都设置成功了,但就是抓取不成功,显示如下图 无奈之下还是用谷歌搜索了下(网速极慢),但是庆幸的找到了问题的答案,原因还是手机设置的问 打 ...
- boostrap 进入条显示百分比
<div class="progress"> <div class="progress-bar progress-bar-success" ...