WCF中定义3种消息交换模式: 1. Request/Reply; 2. One-Way; 3. Duplex。
Request/Reply 是缺省模式,即同步调用。在调用服务方法后需要等待服务的消息返回,即便该方法返回 void 类型。
One-Way 这种方式在调用方法后会立即返回。需要注意的是 One-Way 不能用在非void,或者包含 out/ref 参数的方法上,会导致抛出 InvalidOperationException 异常。
Duplex 又称为双工通信,实现起来比前两种来说要稍微复杂些。(1) ServiceContract 中指定 Callback类型; (2) 对于回调操作,指定[OperationContract(IsOneWay=true)] ; (3) 服务契约中通过 OperationContext.Current.GetCallbackChannel 来获得客户端 Callback 实例。
另外,在WCF预定义绑定类型中,WSDualHttpBinding和NetTcpBinding均提供了对双工通信的支持,但是两者在对双工通信的实现机制上却有本质的区别。WSDualHttpBinding是基于HTTP传输协议的;而HTTP协议本身是基于请求-回复的传输协议,基于HTTP的通道本质上都是单向的。WSDualHttpBinding实际上创建了两个通道,一个用于客户端向服务端的通信,而另一个则用于服务端到客户端的通信,从而间接地提供了双工通信的实现。而NetTcpBinding完全基于支持双工通信的TCP协议。
接下来,介绍如何用WCF的Duplex消息交换实现服务端对客户端的广播。
1. 定义服务契约 (创建WCF Service Library工程:WcfDuplexMessageService)
(1) 定义的IClient用于客户端回调。
(2) 定义的RegisterClient()用于将客户端回调实例注册到服务端
2. 实现服务(工程WcfDuplexMessageService)
(1) 为了所有客户端都注册到一个服务对象上,所以定义服务端为Singleton实例模式:
InstanceContextMode=InstanceContextMode.Single (Singleton的实例在服务Host启动即实例化)
(2) 定义了一个static的List<IClient>统一保存客户端回调实例,并公开为Property,便于ServerUI能访问。
(3) 为了防止广播时不会因为客户端关闭而导致服务端异常,监听了Channel.Closing事件
客户端关闭(Channel被关闭)时就会触发这个事件,在此事件处理中移除该客户端回调实例。
3. 服务端Host兼UI实现
Broadcast 按钮按下时,遍历 WcfDuplexMessageService.MessageService.ClientCallbackList 回调。
配置:
为了客户端能直接通过公开的Metadata生成proxy,配置文件中加上:
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
因为元数据公开的服务(IMetadataExchange)使用的是mexHttpBinding,而Duplex使用的是netTcpBinding,所以需要追加http协议对应的BaseAddress:http://localhost:9998/WcfDuplexMessageService
或者修改元数据公开服务的Binding方式:改为mexTcpBinding
4. 客户端实现
(1) 通过Add Service Reference生成客户端Proxy
(2) 实现 WcfSvc.IMessageServiceCallback (Client.cs)
(3) 启动客户端,调用服务端的注册方法:WcfSvc.MessageServiceClient,将客户端的Client实例注册到服务。
OK,运行一下:
补充:
1. 如果去掉回调契约的IsOneWay属性,将会导致服务端引发InvalidOperationException异常。关于Duplex的消息交换定制还可以看看这篇blog:http://www.cnblogs.com/xinhaijulan/archive/2011/01/09/1931272.html
2. XP的IIS 5.x 使用wsDuplexBinding时, 因为回调的服务监听地址默认采用是80,而80正是IIS独占的监听端口。此时会出现AddressAlreadyInUseException异常。为了解决这个问题,需要修改回调服务监听地址:wsDuplexBinding的clientBaseAddress
本系列链接:
WCF 学习总结1 -- 简单实例
WCF 学习总结2 -- 配置WCF
WCF 学习总结3 -- 实例模式
WCF 学习总结4 -- 用Duplex实现消息广播
WCF 学习总结5 -- 消息拦截实现用户名验证
WCF 学习总结6 -- WCF参数与返回值
WCF 学习总结7 -- 流模式实现文件上传
WCF 学习总结8 –- WCF 事务处理
分享到:
相关推荐
WCF 学习总结4 -- 用Duplex实现消息广播 详细参看:http://blog.csdn.net/fangxinggood/archive/2011/01/15/6142861.aspx#1667031
WCF 实例源代码------聊天室 WCF 实例源代码------聊天室
WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--
WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2
WCF服务编程04-05WCF服务编程04-05WCF服务编程04-05WCF服务编程04-05
wcf开发:WCF培训上课实例-带有宿主的WCF程序。WCF培训上课实例-带有宿主的WCF程序WCF培训上课实例-带有宿主的WCF程序WCF培训上课实例-带有宿主的WCF程序
WCF 学习总结7 -- 流模式(Streaming)实现文件上传 http://blog.csdn.net/fangxinggood/article/details/6164017
11.再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯
《WCF 证书移除工具 - WCFMultiCersRemover》 blog文章源码 WCFMultiCersRemover 提供的功能 对X509证书,CurrentUser/LocalMachine存储区 1、移除WCF所有证书 2、移除所有同名证书 3、移除指定证书名的所有证书...
wcf实例化-单调服务模式,言简意赅,很容易理解。就是现在积分没发控制,不然1分即可。很简单的代码
WCF服务编程的第四和第五章内容,拿出来分享一下
这是一个Ext框架,我对此框架很感兴趣。。。特别想了解一下。。。
学习.net wcf 入门版 pdf english
一个简单WCF聊天室(WCF Duplex)。客户端可以看到在线人员,相互发送消息。
WCF服务学习1,2WCF服务学习1,2WCF服务学习1,2WCF服务学习1,2WCF服务学习1,2WCF服务学习1,2
微软MSDN的WCF实验室手册 是WCF初学者的入门法宝
WCF学习笔记, 一步一步教你学习WCF
WCF学习总结 ppt,包含wcf的体系结构图,创建过程图解,适合wcf初学者。 构建分布式应用程序的技术有:.Net Remoting,Web service,Web service enhancement,MSMQ... WCF(windows communication Fundation)是比以上...
里面包含WCF高级编程、WCF学习笔记、例子等
一个silverlight 图片上传,下载的功能, 配置WCF,可以上传4m图片,