老老实实学WCF
第十篇 消息通信模式(下) 双工
在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式。我们知道可以通过配置操作协定的IsOneWay属性来改变模式。在这一篇中我们来研究双工这种消息通信模式。
在一定程度上说,双工模式并不是与前面两种模式相提并论的模式,双工模式的配置方法同前两者不同,而且双工模式也是基于前面两种模式之上的。
在双工模式下,服务端和客户端都可以独立地调用对方,谁都不用等待谁的答复,同样也不期待对方答复,因为如果期待答复,就变成请求/应答模式了。也就是说双方的调用都是单向调用,即我调你了,你不用回复我,你什么时候想回复我的时候呢你再调我,我就知道了,我是不会等着你的回复的。这样调用双方就会有很好的异步体验,我想调的时候就调,然后我就去干别的,什么时候调用完成了,你可以通过回调来通知我,我再决定下一步的动作,谁都不等谁。
因为在服务模型中,调用总是由客户端首先发起的,所以一般说的调用,都是客户端的行为,在双工模式下,服务器也可以调用客户端,我们就把它叫做回调,实际上这个调用和客户端的调用没什么本质区别,在回调的时候,服务端变成了客户端,客户端相当于在提供服务了,只不过总是客户端调用在前,我们就把服务端对客户端的调用叫做回调了。
1. 建立双工通信的条件
要建立双工通信,必须使用支持双工通信的绑定,比如wsHttpBinding是不支持的,必须采用wsDualHttpBinding才行,他会建立两条绑定来实现互相调用,因此我们首先要注意的是选择正确的绑定。
要建立双工通信,必须使用会话,即将SeviceContract的SessionMode配置为SessionMode.Required。
2. 如何配置双工通信
为了更好地理解这个问题,我们先考虑单工的情形,在单工模式下(单向和请求应答),调用总是由客户端发起的,服务端可以回应也可以不回应。我们是怎么配置实现这个的呢?我们首先让两端共享服务协定接口,这样客户端才知道怎样调用服务端,然后把服务实现类写在服务端,这样服务端才能在收到请求的时候实例化这个类并执行服务的操作逻辑。也就是说,客户端要想调服务端,客户端必须拥有服务协定接口,而服务端必须拥有服务协定接口以及实现接口的服务类,在运行时服务端还要有服务类的实例。这些是必备条件。
再说回双工,双工让服务端可以调客户端,那么道理同单工,必备条件也要有才行,只是他们的地位互换了。也就是说服务端必须拥有协定接口,客户端必须拥有协定接口以及实现接口的类,在运行时客户端还要有类的实例。一般情况下我们管服务端的定义的协定接口叫做服务协定,协定接口实现类叫做服务类,这回换到客户端,我们管它叫回调接口,回调类,其实作用是一样的。
也就是说在定义上,我们需要在两边都定义两个协定接口,一个服务协定接口,一个回调协定接口,把服务协定接口的实现类写在服务端,把回调协定接口的实现类写在客户端。
通过配置服务协定的ServiceContract的CallBackContract属性来指定回调的时候使用的回调协定,考虑下面的代码:
[ServiceContract(SessionMode = SessionMode.Required,CallbackContract = typeof(IHelloWCFCallback))]public interface IHelloWCF{[OperationContract(IsOneWay = true)]void HelloWCF();}public interface IHelloWCFCallback{[OperationContract(IsOneWay = true)]void Callback(string msg);}
我们定义了一个IHelloWCFCallback的回调协定接口,这个接口的实现是写在客户端的,同时指定了IHelloWCF服务协定接口的回调协定为该回调协定接口,这样服务协定就知道怎样进行回调了。
同样在客户端要写出回调协定接口及其实现,如果我们使用了或添加服务引用,系统会为我们自动填写回调协定接口,但是不会为我们写实现类,毕竟她不知道我们的客户端在接受回调的时候执行怎样的逻辑。我们得自己编写,一个回调协定接口的实现类看上去是这样的:
public class HelloWCFCallback : Services.IHelloWCFCallback{public void
本文发布于:2024-02-01 22:37:38,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170679825939885.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |