SignalR2上的onDisconnect事件是否在断开连接后释放所有资源?

时间:2015-01-17 03:09:18

标签: signalr signalr-hub signalr.client

我的控制器上有一个并发字典列表,用于存储在线用户列表。例如,当客户端A和客户端B连接时,列表中存在2个在线客户端,但是当我断开B然后再次重新连接时,它仍然必须显示2个在线客户端,但在我的情况下,只有客户端B被检测为在线用户(断开然后重新连接)。我正在使用IIS服务器7.5 ..请帮我这个,我需要使用数据库而不是字典吗?我认为如果一个用户断开连接并再次重新连接,它会将字典重置为零.... :(以下是我的集线器类代码

public class Chat : Hub
{
    //add online client
   private static ConcurrentDictionary<string, string> personLists
    = new ConcurrentDictionary<string, string>();

    public void Connect(string Username, int ID)
    {
      string id = Context.ConnectionId;
        if (!personLists.ContainsKey(Username))
        {
            personLists.TryAdd(Username, id);
            Clients.Caller.viewOnlinePersons(personLists.Where(p =>  p.Key != Username));
            Clients.Others.enters(Username);
        }
        else
        {

            string notif = "user: "+Username+" is already used";
            Clients.Caller.onUse(notif);
        }

1 个答案:

答案 0 :(得分:0)

并发字典应该可以正常工作。如果你可以发布一些代码会很好,但是如果你使用并发字典去这条路线,请确保它是static(每个信号创建和销毁Hub类)并且我认为它' d更适合放在集线器本身和私有(当然还有static)。你也可以使用依赖注入与SignalR,这将更加清洁。

如果您打算在多个服务器上运行应用程序,那么您只需要将数据库作为背板,当然其他服务器无法访问单个服务器的内存,并且会为每个服务器创建重复的字典,因此在这种情况下,您需要占用存储空间并将其在架构中向上移动一点,以供所有服务器访问。