Signalr连接、断开和重新连接

3

我希望确保我在使用SignalR库的群组特性时做得正确。

我的做法是允许用户为一个特定项目请求帮助。项目发起者可以将其他用户添加到协作表中参与他们的项目。

Collaboration 
(
    UserID Uniqueidentifier,
    ProjectID INT
)

如果任何一个用户进入协作模式,我希望将该用户添加到一个组中,以便如果另一个用户登录并进入协作模式,则会将其添加到同一组中。这些组始终以ProjectID命名。
因此,当用户登录并打开项目时,如果该项目在协作表中,则将其添加到Groups.Add(Context.ConnectionId, projID)中。
以下是我的问题:
当用户从客户端连接并调用OnConnected时,如果不存在具有projID的组,它会抛出错误还是signalr会即时创建该组?
    public override Task OnConnected(string projID)
    {
        return Groups.Add(this.Context.ConnectionId, projID);
    }

当客户端关闭浏览器时,OnDisconnected方法会被调用吗?如果该用户因某些原因不在projID组中,这是否会引发错误或signalr会处理这个问题?
    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());
    }

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

1
毫不冒犯,但你为什么不试一下呢?1.如果不存在则创建。2.是在会话结束时调用“已断开连接”(浏览器关闭事件);它不会抛出错误,并且如果该用户不在该组中,则会被处理。3.重新连接是指客户端在一段时间内没有发送心跳信号,然后由于网络连接丢失等原因突然重新连接。你发布的代码可以处理用户的重新连接,并将其添加到该组中以及使用新的连接 ID。 - cillierscharl
你为什么不直接回答那个评论,这样我就可以把你的评论标记为答案了呢? - Filling The Stack is What I DO
1个回答

7
  1. 当您首次针对特定的projID调用Groups.Add()时,SignalR将创建该组。它不会抛出错误。
  2. OnDisconnected在连接断开时调用。如果您调用Stop()进行干净的断开,则OnDisconnected方法会立即被调用。如果您只是关闭了浏览器,则OnDisconnected方法通常会在约30秒后被调用(有一个配置开关来控制这个时间)。
  3. 用户根据其连接ID与特定组相关联。如果用户使用不同的连接ID返回,则必须再次将其添加到适当的组中。您可以查看SignalR提供的聊天示例,以了解如何处理此类情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接