signal r存储Context.connectionID

时间:2016-10-04 06:10:26

标签: signalr signalr-hub

我是signalr的新手,我想为特定客户端生成连接ID并将其存储在数据库中,任何客户端完成任何更新后都会通知所有人,但将context.connectionID存储到数据库是一种好习惯,如果不是我想知道维护所有客户端之间的连接需要帮助。

1 个答案:

答案 0 :(得分:0)

当客户端在服务器端调用函数时,您可以通过Context.ConnectionId检索其连接ID。现在,如果您想通过集线器外部的机制访问该连接ID,您可以:

让Hub调用传递连接ID的外部方法。 通过添加public static ConcurrentDictionary<string, MyUserType>中的字典并在OnConnected中删除字典来管理已知连接的客户列表,例如OnDisconnected ...获得用户列表后,您可以通过外部机制查询它。

Ex 1:

    public class MyHub : Hub
    {
        public void AHubMethod(string message)
        {
            // Send the current clients connection id to your external service
            MyExternalSingleton.InvokeAMethod(Context.ConnectionId); 
        }
    }
EX : 2

    public class MyHub : Hub
{
    public static ConcurrentDictionary<string, MyUserType> MyUsers = new ConcurrentDictionary<string, MyUserType>();

    public override Task OnConnected()
    {
        MyUsers.TryAdd(Context.ConnectionId, new MyUserType() { ConnectionId = Context.ConnectionId });
        return base.OnConnected();
    }

    public override Task OnDisconnected()
    {
        MyUserType garbage;

        MyUsers.TryRemove(Context.ConnectionId, out garbage);

        return base.OnDisconnected();
    }

    public void PushData(){
        //Values is copy-on-read but Clients.Clients expects IList, hence ToList()
        Clients.Clients(MyUsers.Keys.ToList()).ClientBoundEvent(data);
    }
}

public class MyUserType
{
    public string ConnectionId { get; set; }
    // Can have whatever you want here
}

// Your external procedure then has access to all users via MyHub.MyUsers