2010-12-08 130 views
0


我使用this示例来实现WCF服务,该服务在服务发生某些事件时向所有客户端引发事件(使用回调)。
问题是这个例子只在服务实例是percall时才起作用。WCF percall和单实例

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Reentrant)] 

我想使用单个实例,但它不会工作。
它将所有事件触发到最后订阅的客户端。
请帮忙。

回答

2

感谢克里斯,我发现this示例显示如何使用InstanceContextMode.Single时处理乘法回调用户。
该示例显示了如何管理回调通道的字典(列表也是可能的)。 Igal。

3

样品有InstanceContextMode.PerSession,而不是InstanceContextMode.PerCall。每个订阅的客户端都与一个独立的MyService实例关联。这些实例中的每个实例都有一个成员字段_callbackInstance,该成员字段保存对其特定客户端的回调通道的引用。 MyService的所有实例都通过静态事件Broadcast关联到“聊天室”,并且当特定客户端说出某些内容时,代码遍历静态事件的调用列表以向每个订阅的客户端广播。

如果您制作MyService单身人士,_callbackInstance只包含最后订阅的客户端的回叫通道,这就是您看到您描述的行为的原因。

为了使服务类作为单例实例正常运行,您必须将_callbackInstance替换为包含订阅客户端的所有回调通道的集合,并且在客户端到达时自己管理这个集合中的添加和删除操作离开。广播将涉及迭代这个集合。这种方法的缺点是多个客户端可能会同时调用服务,因此您需要明确地将访问权限与类的成员同步,以确保线程安全和正确的行为。

+0

谢谢,你真的帮了我。这是非常专业的答案。阅读我的答案,看看我做了什么。 – Igal 2010-12-08 12:42:31