3

我想确保我为 SignalR 库正确实现了组功能。

我正在做的是允许用户为特定项目寻求帮助。启动项目的用户可以将其他用户添加到他们项目的协作表中。

Collaboration 
(
    UserID Uniqueidentifier,
    ProjectID INT
)

如果任何一个用户进入协作模式,我想将该用户添加到一个组中,因此如果另一个用户登录并进入协作模式,他们将被添加到同一个组中。这些组始终命名为ProjectID.

因此,当用户登录并打开项目时,如果该项目在协作表中,我会将它们添加到Groups.Add(Conext.ConnectionId,projID);


以下是我的问题:

当用户从客户端连接并调用 OnConnected 时,如果不存在具有 projID 的组,这会引发错误,还是信号器会即时创建该组?

    public override Task OnConnected(string projID)
    {
        return Groups.Add(this.Context.ConnectionId, projID);
    }

当客户端关闭他们的浏览器时,是调用 OnDisconnected 的时候吗?如果该用户由于某种原因不在所述 projID 组中,这会抛出错误还是信号器会处理这个?

    public override Task OnConnected(string projID)
    {
        return Groups.Add(this.Context.ConnectionId, projID);
    }

对于 OnReconnected,这是否意味着如果用户注销并执行其他操作然后重新登录,他们会自动添加回连接丢失之前所在的组?

    public override Task OnReconnected(string projID)
    {
        return Clients.Group(projID).rejoined(Context.ConnectionId,
            DateTime.Now.ToString());
    }

对于上述所有方法,我是否需要调用每个覆盖方法的基本方法?

4

1 回答 1

7
  1. SignalR 将在您Groups.Add()第一次调用特定的projID. 它不会抛出错误。
  2. OnDisconnected每当连接消失时都会调用。如果您拨打电话Stop(),则断开连接并OnDisconnected 立即调用该方法。如果你只是关闭浏览器,该 OnDisconnected方法通常会在延迟大约 30 秒后被调用(有一个配置开关来控制这个)
  3. 用户根据他们的连接 ID 绑定到特定组。如果用户返回时使用不同的连接 ID,则必须将其再次添加到相应的组中。您可以查看 SignalR 提供的 Chat 示例,了解如何处理此类情况。
于 2013-02-18T08:29:52.767 回答