【问题标题】:Why are we checking context.connectionId when a recconect in signalR occurs?为什么我们在 signalR 中发生重新连接时检查 context.connectionId?
【发布时间】:2016-06-15 04:19:47
【问题描述】:

据我所知,SignalR 集线器中的 OnReconnected 事件处理程序可以直接在 OnConnected 之后执行,但不能在给定客户端的 OnDisconnected 之后执行。 (来源:http://www.asp.net/signalr/overview/guide-to-the-api/handling-connection-lifetime-events

那么,如果onDisconnected之后永远不会发生onReconnected并且context.connectionId保持不变,为什么官方示例会检查用户连接中的context.connectionId,如果不存在则添加它。

链接:http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections

【问题讨论】:

    标签: .net signalr signalr-hub


    【解决方案1】:
      public override Task OnDisconnected(bool stopCalled)
            {
                string name = Context.User.Identity.Name;
    
                _connections.Remove(name, Context.ConnectionId);
    
                return base.OnDisconnected(stopCalled);
            }
    

    如果正常断开连接,stopCalled 将为真。否则,它将是错误的(超时等),但这并不意味着信号器肯定会断开连接。

    如果 SignalR 位于配置了横向扩展的负载平衡器之后,则 客户端可能仍连接到另一个 SignalR 服务器。

    即使客户端没有断开连接,OnDisconnected(false) 也可以被触发。然后你删除Context.ConnectionId

    但如果客户端仍处于连接状态,则会触发重新连接。所以那个时候你应该检查一下你是否删除了这个与OnDisconnected(false)的连接,这并不是真正的断开连接。

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      相关资源
      最近更新 更多