通过实例分析WCF Duplex消息交换

因为Duplex实现了客户端与服务端双向通信的功能,故而我实现了一个简单的聊天室程序,展现Duplex的特点。有朋友在阅读了这个例子之后,提出一个问题,即“如何让服务端向指定的客户端发送消息?”很高兴的是,这位朋友在后来的邮件中说到问题已经解决了,思路是利用Singleton对象保存客户端的Session。虽然存在一些比较奇怪的问题,然而总算是一种思路。

我的思路与之相似,需要服务端维护一个Dictionary的集合,用以保存客户端的信息。服务端在发送消息时,可以通过查找Dictionary对象,识别符合条件的客户端。当我还在思考这样的方式能否解决问题时,我在WCF官方网站上偶然发现了一个同样利用Duplex实现聊天室的Sample。

仔细阅读了实例代码,我恍然发现自己在思考程序设计时,并没有理解WCF最核心的价值,那就是“服务”。作为实现SOA体系架构的技术框架,WCF最重要的特征就在于能够定义和提供服务。以聊天室程序为例,虽然服务端会参与消息的交互,但却不应该参与到聊天中。也就是说,客户端与服务端的角色任务是不相同的。通过用例图可以看到两者之间的区别: 

图1 正确的用例图

图二 错误的用例图

明确了以“服务”为核心的程序结构,我们才能够更好地利用WCF,定制自己的服务,分清楚服务的边界,定义好消息的格式。虽然,一个聊天室程序无法体现SOA的核心精神,然而树立面向服务的思想确实必要的。正如我们在开始面向对象程序设计时,需要树立面向对象的思想一样。

该聊天室程序的实现主要通过Duplex来实现,其中又利用了MulticastDelegate与异步调用。其中,服务接口的定义如下:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IChatCallback))]
  interface IChat
  {
    [OperationContract(IsOneWay = false, IsInitiating = true, IsTerminating = false)]
    string[] Join(string name);
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void Say(string msg);
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void Whisper(string to, string msg);
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = true)]
    void Leave();
}

时间: 2024-10-02 21:55:02

通过实例分析WCF Duplex消息交换的相关文章

艾伟:WCF从理论到实践(7):消息交换模式

本系列文章导航 WCF从理论到实践(1):揭开神秘面纱 WCF从理论到实践(2):决战紫禁之巅 WCF从理论到实践(3):八号当铺之黑色契约 WCF从理论到实践(4):路在何方 WCF从理论到实践(5):Binding细解 WCF从理论到实践(6):WCF架构 WCF从理论到实践(7):消息交换模式 WCF从理论到实践(8):事件广播 WCF从理论到实践(9):实例模式和对象生命周期 WCF从理论到实践(10):异常处理 WCF从理论到实践(11)-异步 WCF从理论到实践(12):事务 WCF

WCF从理论到实践(7):消息交换模式

本文的出发点 通过阅读本文,您能理解以下知识: WCF定义了哪几种消息交换模式? One-Way Calls Request/Reply Duplex 用示例来解析WCF的消息交换模式 本文适合的读者 本文涉及到了SOA中的消息交换的基础概念,需要一些初级的Xml Web Service和分布式系统开发的经验,最好理解WCF架构 WCF定义了哪几种消息交换模式? WCF定义了三种消息交换方式 ,分别为: One-Way Calls Request/Reply Duplex One-Way Cal

《WCF技术内幕》翻译15:第1部分_第3章_消息交换模式、拓扑与编排:消息拓扑

<WCF技术内幕>翻译15:第1部分_第3章_消息交换模式.拓扑与编排:消息拓扑.消息编排和本章小结 消息拓扑 消息拓扑描述的是在一个或多个发送者和接受者之间消息如何发送的.消息拓扑可以描述简单的应用-应用的连接关系,但是它同样可以描述复杂的应用-企业的连接.在后续文章里,面向服务的应用的作用会显现出来.概括地说,这些可能存在的拓扑结构比面向组件的应用系统能够涉及到的情况会更加多.更加复杂. 某种层次上,一个消息拓扑是一个或者多个消息交换模式(MEP)的组合.实际上可能存在有无数种拓扑结构,但

《WCF技术内幕》翻译14:第1部分_第3章_消息交换模式、拓扑与编排…

<WCF技术内幕>翻译14:第1部分_第3章_消息交换模式.拓扑与编排:消息交换模式(MEP) 第3章:消息交换模式.拓扑和编排 当设计消息应用系统的时候,有必要考虑一下消息是怎样在发送者.中介者 和接受者(前面章节介绍了这些消息参与者)流转的.系统中消息交换可能性的 波动的值可以被不同程度地详细描述.这些不同级别的细节就是总所周知的消息 交换模式(MEPS).消息拓扑和消息编排[老徐备注1].当从总体来看时,这 三个级别的细节让我们抽象地描述任何消息场景.本章会详细剖析消息交换模式 (MEP

Android编程之消息机制实例分析_Android

本文实例讲述了Android编程之消息机制.分享给大家供大家参考,具体如下: 一.角色描述 1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列). 2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里:或者接收Looper(从Message Queue取出)所送来的消息. 3. Message Queue(消息队列):用来存放线程放入的消息. 4.线程:UI thr

Android编程之消息机制实例分析

本文实例讲述了Android编程之消息机制.分享给大家供大家参考,具体如下: 一.角色描述 1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列). 2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里:或者接收Looper(从Message Queue取出)所送来的消息. 3. Message Queue(消息队列):用来存放线程放入的消息. 4.线程:UI thr

PHP消息队列用法实例分析_php技巧

本文实例讲述了PHP消息队列用法.分享给大家供大家参考,具体如下: 该消息队列用于linux下,进程通信 #根据路径和后缀创建一个id $key = ftok(__DIR__, 'R'); #获取队列中的消息 $q = msg_get_queue($key); #删除队列 msg_remove_queue($q); #获取队列的状态信息 $status = msg_stat_queue($q); print_r($status); echo "\n"; for($i=0;$i<1

php选择排序法实现数组排序实例分析

 这篇文章主要介绍了php选择排序法实现数组排序的方法,实例分析了选择排序的原理与具体执行步骤,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例分析了php选择排序法实现数组排序的方法.分享给大家供大家参考.具体分析如下: 选择排序法的基本思路:直接用案例来说明吧,比如有一个数组$arr = array(2,6,3,9),从大到小排序. 第一次大循环:它首先假设$arr[0]为最大值,然后分别跟$arr[1]~$arr[3]进行比较,如果比较它大,则进行交换,过程是这样(2,6,3,

Go语言中关闭带缓冲区的频道实例分析_Golang

本文实例分析了Go语言中关闭带缓冲区的频道.分享给大家供大家参考.具体分析如下: Go语言提供了两种频道,带缓冲区和不带缓冲区的.不带缓冲区的频道,发送和接收是同步的,必须接收端接收了消息,发送端才能从发送调用中解脱.带缓冲区的频道,在缓冲区满之前,发送和接收是异步的,发送端的发送操作只保证把消息放入缓冲区. Go的频道是可以关闭的,关闭频道的目的是让接收端知道不会再有消息从这个频道进入,我们可能会用某个频道的关闭来表示某种状态的终结. 当我们关闭一个带缓冲区的频道时,如果缓冲区中还有消息,接收