WCF percall和单个实例

时间:2010-12-08 06:46:29

标签: wcf session callback


我使用this示例来实现WCF服务,该服务在服务上发生事件时向所有客户端触发事件(使用回调)。
问题是此示例仅在服务实例是percall时才有效。

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

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

2 个答案:

答案 0 :(得分:3)

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

如果您将MyService设为单身,_callbackInstance仅包含最后订阅的客户端的回调频道,这就是您看到所描述行为的原因。

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

答案 1 :(得分:2)

感谢Chris,我发现this示例显示了在使用InstanceContextMode.Single时如何处理多个回调订阅者。
示例显示如何管理回调的字典(列表也可以)通道。 有约色。