是否可以进行特定于会话的SIgnalR连接?

时间:2016-09-18 12:07:22

标签: .net signalr

让我们假设我正在使用SignalR实现访问者计数器。每当新访客到达时,静态变量就会递增,并且每当访问者离开建筑物时,静态变量就会递减。我想知道连接是否是特定于会话的,所以我可以在创建新会话时递增计数器,并在会话不再连接时递减它。

这意味着每当用户在登录时成功登录或打开浏览器中的第一个选项卡时,计数器应该递增,并且每当浏览器中的最后一个选项卡关闭时,计数器应该递减。我可以这样做:

  • 在服务器上,我存储所有具有活动连接的会话
  • 每当打开此选项卡时,都会调用服务器方法,该方法将检查当前会话是否在存储中,如果是,则增加选项卡计数
  • 每当关闭此选项卡时,将调用服务器方法,这将减少选项卡计数,如果为0,则从存储中删除会话
  • 每当连接丢失时(例如,浏览器关闭,互联网连接丢失),会话将从存储中删除

我想知道SignalR是否可以开箱即用,因此SignalR会跟踪与sessionid的连接。是吗?

1 个答案:

答案 0 :(得分:2)

考虑到您使用的是Hub类,可以使用服务器端事件和相应的处理程序(例如OnConnectedOnDisconnected)来执行此操作。

public class ContosoChatHub : Hub
{
    public override Task OnConnected()
    {
        //this is called after connection is started.
        return base.OnConnected();
    }

    public override Task OnDisconnected()
    {
        //called when the connection is disconnected.
        return base.OnDisconnected();
    }
}

有关详情,请查看How to handle connection lifetime events in the Hub class

更新:每当建立新连接时,SignalR框架都会自动调用OnConnected。在那里你可以增加你的静态变量,什么不是。在OnDisconnected中,只要连接被销毁/停止,就可以减少调用的变量。

除此之外,您还可以将UserGroup和连接信息保存在SQL Server等外部存储器中,并明确跟踪它。

相关问题