【例子介绍】
【相关图片】
【源码结构】
下面就是我们服务的实现了,服务的实现很简单,仅仅是捕获到客户端的回调通道,对集合进行操作。这里需要注意的是ServiceBehavior标记的InstanceContextMode属性的设置。我们需要为每一个单独的通道创建新的实例,但是在调用玩服务后,不对通道立刻进行回收,因此我们需要设置为InstanceContextModel.Single。
PushService /// <summary>
/// 服务的实现
/// Tips:
/// 实现发布订阅,要注意:每个信道在调用后不要回收,否则会在回调时报错
/// </summary>
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class PushService : IPushService
{
public void Regist()
{
IPushCallback callbackChannel = OperationContext.Current.GetCallbackChannel<IPushCallback>();
//添加到管理列表中
ChannelManager.Instance.Add(callbackChannel);
}
public void UnRegist()
{
IPushCallback callbackChannel = OperationContext.Current.GetCallbackChannel<IPushCallback>();
//从管理列表中移除
ChannelManager.Instance.Remove(callbackChannel);
}
}
这样我们的服务基本就完成了,置于客户端的调用,需要创建一个双工通道对象,并且将实现了回调契约的类型,传给InstanceContext属性。
这篇文章很简单,没有涉及到对产生异常的通道的处理,也没有考虑到Silverlight调用时遇到的跨域问题,同时不支持HttpGet。
文章的目的只有一个,就是尽可能简洁的体现发布订阅服务的原理。
有兴趣的读者,可以对服务进行扩展,对服务在广播时可能产生的各种异常进行处理。
由于文章的例子是基于TCP/IP的通迅方式,使用的是netTcpBinding的全双工模式,因此使用HttpGet的时候需要进行一些额外的设置。
并且由于是自托管服务,寄宿在控制台应用程序中,因此跨域文件的提供方式也不太相同。
评论