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);
}
}

最新文章

  1. Eclipse导入现有项目
  2. Javascript 封装方法
  3. (剑指Offer)面试题15:链表中倒数第k个结点
  4. centos 6.5 安装lnmp(linux+nginx+mysql+php)
  5. Msys+Mingw在手 妙用在心!
  6. Test Markdown Editor
  7. CMDB, 配置管理数据库, ITIL - ManageEngine ServiceDesk Plus
  8. BZOJ 1037 [ZJOI2008]生日聚会Party(单调DP)
  9. iOS设计模式:观察者
  10. JS表单提交的几种方式
  11. 【LintCode&#183;入门】斐波那契数列
  12. 集合之LinkedList源码分析
  13. kettle 通用的数据库迁移流程
  14. Summary on deep learning framework --- TensorFlow
  15. python3字典中items()和python2.x中iteritems()有什么不同?
  16. nginx的location、rewrite玩法详解
  17. C# Task ContinueWith的实现
  18. PHP对接微信支付采坑
  19. java 遇到的问题
  20. JavaScript----特效代码

热门文章

  1. intellij idea 在执行maven的操作 install等会出现中文乱码?其他程序打印正常?
  2. OpenStack基础及概念
  3. Luogu 4310 绝世好题
  4. Entity Framework Tutorial Basics(1):Introduction
  5. IDEA内嵌Jetty启动SpringMvc项目
  6. JMeter上传文件 点选form-data依旧失败的解决方法
  7. WPF之MVVM模式(1)
  8. 查询sql语句的执行时间
  9. metasploit 读书笔记1
  10. 消息队列开发记录笔记-ActiveMQ