【问题标题】:SignalR: How does server correctly subscribe to a group when connection is establishedSignalR:建立连接时服务器如何正确订阅组
【发布时间】:2013-03-18 15:45:04
【问题描述】:

我看过几个地方,但仍然找不到关于如何使用组的明确说明。我正在使用组进行过滤(仅将消息传递给客户端子集)。

我想在OnConnected 事件中将客户端加入服务器端的组。客户端不需要知道它属于哪些组。

问题:

  1. 我是否也应该覆盖OnReconnected 事件?

  2. 我应该返回从GroupManager.Add 返回的任务作为OnConnected 事件的结果吗?如果我想加入多个组,我可能需要创建一个组合任务。对吧?

3- 为什么服务器(参见GroupManager.Add 实现)向客户端发送AddToGroup 命令?有没有办法解决这个问题?也许通过使用Client.AllExcept(...) 并在服务器上手动处理组成员身份(糟糕!)?

我正在使用最新版本的 SignalR (1.0.0.1)

【问题讨论】:

    标签: asp.net .net signalr


    【解决方案1】:
    1. 您不需要覆盖 OnReconnected。当客户端重新连接时,它将重新加入之前所在的所有组。
    2. 您不必这样做,但如果您尝试在 OnConnected 中发送到该组(如果您选择不返回组添加任务),则需要等到任务完成。
    3. 您不想解决此问题,其必要的原因之一是因为 #2(客户端需要知道它所在的组)。如果您想对组进行身份验证以重新连接,您始终可以创建一个中心管道模块并覆盖 BuildRejoiningGroups 函数以执行您自己的验证。

    评论回复

    评论 1:是的
    评论 2:您必须返回一个任务,否则什么都不会完成(这是设计使然)。如果您不知道要返回什么,您可以随时返回 base.OnConnected()。

    当您调用 GroupManager.Add 时,它会返回一个表示连接何时位于所需组中的任务。一旦加入该组,客户端就会通过令牌收到通知,它现在在一个新组中。如果由于失去连接而必须重新连接,令牌将允许客户端重新加入组。

    【讨论】:

    • 所以 Ad3) 的原因 - 客户端应该知道他所属的组是客户端在重新连接时自动发送组成员身份?
    • Ad2):如果我没有从 OnConnect 返回任务,则客户端不会收到消息(即使服务器端延迟 10 秒)。另见this question。如果我不从OnConnected 返回,谁来启动GroupManager.Add 返回的任务? MessageBus.ScheduleTopic / MessageBroker.Schedule?
    • 感谢您的解释。我从OnConnected' method which was not OK. Since this task was not started. base.OnConnected()' 返回了新的Task(() => { }),返回空的,已经完成的任务,这没关系。如果我理解正确,MessageBroker.Schedule 将加入组消息放入队列中,PumpImplAsync 实际上开始加入组的任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2018-02-15
    • 1970-01-01
    • 2021-06-01
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多