1,Dupex(双工) MEP(消息交换模式),服务端回调(Callback)客户端操作

2,客户端调用服务时,附加上一个回调对象(InstanceContext)。服务端处理服务请求时,通过该回调对象调用客户端操作。

3,WCF系统设计常用四层结构:Contracts(契约),Services(服务),Hosting(服务寄宿),Clients(客户端)

4,客户端调用服务,需要服务契约;服务端回调客户端操作,同样需要回调契约。回调契约通过ServiceContract(服务契约)特性的CallbackContract属性指定

5,回调契约本质也是服务契约,但在服务契约里已指明该回调契约的服务契约属性,所以回调契约不需要再标记ServiceContract属性

6,服务端在处理服务请求时,通过当前的OperationContext.Current.GetCallback<T>方法获取回调对象,T代表回调契约的类型

7,OperationContext代表服务操作执行上下文,通过静态属性Current获取当前OperationContent。我们可以在服务端或客户端设置一些上下文,比如为出栈消息添加Soap报头,从入栈消息取出报头等

8,为执行回调,客户端首先要实现回调契约:定义继承回调契约的类,实现回调契约接口方法

9,调用双工服务,先创建回调对象,并通过InstanceContext对回调对象包装,然后用DuplexChannelFactory<TChannel>方法创建服务通道。

10,用服务通道的CreateChannel方法生成服务代理对象,进而调用服务方法。

11,服务响应请求,回调回调对象的方法,在客户端执行回调方法。

契约定义:

using System.ServiceModel;
namespace Contracts
{
[ServiceContract(CallbackContract = typeof(ICallback))]
public interface ICalculator
{
[OperationContract(IsOneWay =true)]
void Add(double x,double y);
} public interface ICallback
{
[OperationContract(IsOneWay = true)]
void DisplayResult(double x, double y, double result);
}
}

服务实现:

using Contracts;
namespace Services
{
public class CalculatorService : ICalculator
{
public void Add(double x, double y)
{
double result = x + y;
ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
callback.DisplayResult(x,y, result);
}
}
}

服务寄宿:

using System;
using System.ServiceModel;
using Services;
namespace Hosting
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
{
host.Open();
Console.Read();
}
}
}
}

寄宿配置:

  <system.serviceModel>
<services>
<service name="Services.CalculatorService">
<endpoint address="net.tcp://127.0.0.1:9999/CalculatorService" binding="netTcpBinding" contract="Contracts.ICalculator"/>
</service>
</services>
</system.serviceModel>

客户端调用及回调实现:

using Contracts;
using System;
using System.ServiceModel;
namespace Clients
{
class Program
{
static void Main(string[] args)
{
InstanceContext instanceContext = new InstanceContext(new CalculatorCallback());
using (DuplexChannelFactory<ICalculator> ChannelFactory = new DuplexChannelFactory<ICalculator>(instanceContext, "CalculatorService"))
{
ICalculator prox = ChannelFactory.CreateChannel();
using (prox as IDisposable)
{
prox.Add(, );
Console.Read();
}
}
}
}
class CalculatorCallback : ICallback
{
public void DisplayResult(double x, double y, double result)
{
Console.WriteLine($"{x} + {y} = {result}");
}
}
}

客户端配置:

  <system.serviceModel>
<client>
<endpoint name ="CalculatorService" address="net.tcp://127.0.0.1:9999/CalculatorService" binding="netTcpBinding" contract="Contracts.ICalculator"/>
</client>
</system.serviceModel>

WCF Tcp双工通信 Get !

WCF双工通信笔记的更多相关文章

  1. WCF双工学习笔记

    WCF双工的作用在于服务端执行某个方法的时候调用客户端的方法,有点类似委托的感觉,实际项目中在什么情况下使用还没想到. WCF双工支持两种bind,一是nettcp.另一个是wsDualHttp,这里 ...

  2. Wcf 双工通信的应用

    概述 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工ME ...

  3. WCF 双工通信

    注释:本学习是参考Artech大神的资料: 在WCF 实现双工通信 在这里我就不介绍双工通信的概念了,我写博客的目的是检测自己掌握情况,看我wcf通信后,觉得纸上得来终觉浅,绝知此事要躬行. 我使用的 ...

  4. WCF双工通信单工通信

    1.单工模式 单向通信,指通信只有一个方向进行,即从客户端流向服务,服务不会发送响应,而客户端也不会期望会有响应.这种情况下,客户端发送消息,然后继续执行 运行后报错: 2.双工模式 双工模式的特点是 ...

  5. wcf双工通信

    一直以为感觉双工没弄懂,着实觉得很惆怅,在网上了解下双工的一些特点,直接上代码,以便以后项目中用的着: service层: 定义一个IDuplexHello服务接口 [ServiceContract( ...

  6. [转载]WCF实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  7. 我的WCF之旅(3):在WCF中实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  8. 在WCF中实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  9. 利用WCF双工模式实现即时通讯

    概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...

随机推荐

  1. POJ3565带权匹配——km算法

    题目:http://poj.org/problem?id=3565 神奇结论:当总边权最小时,任意两条边不相交! 转化为求二分图带权最小匹配. 可以用费用流做.但这里学一下km算法. https:// ...

  2. eclipse启动报错:An error has occurred.See the log file D:\eclipse\configuration\1552616709202.log

    如题,Eclipse崩了,只能按它留下的线索去看了1552616709202.log: !SESSION -- ::08.739 ----------------------------------- ...

  3. emacs配置buffer的快捷键

    emacsConfig/buffer-setting.el (global-set-key (kbd "<M-left>") 'previous-buffer) (gl ...

  4. 关于hashmap的排序

    刚学java不久 之前在学习hashmap的时候 无意间发现,诶?怎么结果是排序的,然后重新输入了好多次,握草,原来java 1.8都实现了hashmap的排序 天真的我没有去网上查,没有去想java ...

  5. Data_Structure03-栈和队列

    一.学习总结 1.写出你认为本周学习中比较重要的知识点关键词 ·抽象数据类型 ·栈和队列 2.思维导图 二.PTA实验作业 选题: 1.7-1 jmu-字符串是否对称(20 分) 2.7-4(选做) ...

  6. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  7. ZOJ-3230-Solving the Problems

    /*ZOJ Problem Set - 3230Solving the Problems ------------------------------------------------------- ...

  8. Linux安装Python虚拟环境virtualenv

    1.安装virtulenv.virtulenvwrapper包 pip install virtualenv virtualenvwrapper 2.virtualenvwrapper是virtual ...

  9. 关闭 iTunes 自动同步

    关闭 iTunes 自动同步 iTunes>Edit>perererset>device>Prevent iPods,iPhone, and iPads from syncin ...

  10. tensorflow 基本函数(1.tf.split, 2.tf.concat,3.tf.squeeze, 4.tf.less_equal, 5.tf.where, 6.tf.gather, 7.tf.cast, 8.tf.expand_dims, 9.tf.argmax, 10.tf.reshape, 11.tf.stack, 12tf.less, 13.tf.boolean_mask

    1.  tf.split(3, group, input)  # 拆分函数    3 表示的是在第三个维度上, group表示拆分的次数, input 表示输入的值 import tensorflow ...