在SignalR中向组添加用户名

时间:2015-01-12 12:18:14

标签: asp.net signalr

使用群组时是否可以使用IUserIDProvider而不是ConnectionID?我已经找到答案here,但这涉及SignalR 1.0版本。我想知道,2.0中是否有变化。

到目前为止,我正在使用传统的

Groups.Add(Context.ConnectionId, "groupName");

但是,当他们的connectionID被更改时很难跟踪连接的用户(客户端是Xamarin Android应用程序,并且不知何故,重新连接总是导致创建新的ConnectionID)。因此,当客户端连接时,我添加了一个标题:

    public async Task<bool> Login(int waitMilis, string name)
    {
        var cts = new CancellationTokenSource();

        try
        {
            cts.CancelAfter(waitMilis);
            _connection.Headers.Add("userName", name);
            await _connection.Start();
            return true;
        }
        catch(Exception ex)
        {
            CallFailure(ex);
            return false;
        }
    }

在服务器端,实现了IUserIdProvider:

public class MyUserProvider : IUserIdProvider
{
    public string GetUserId(IRequest request)
    {
        if (request == null)
            throw new ArgumentNullException("request");
        else if (request.Headers != null && request.Headers["userName"] != null)
            return request.Headers["userName"].ToString();
        else return null;
    }
}

现在,我想做一些像

这样的事情
Groups.Add("userName", "groupName");

但是Add方法没有IUserIdProvider的重载。那么,是否有可能将IUserIdProvider与组合使用,或者我是否坚持创建ConcurrentDictionary然后调用它?

        foreach(User user in group.Users)
        {
            Clients.User(user.Name).SendMessage(message,
                group.LastUpdateIndex
                );
        }

它破坏了SignalR代码的整体美观和简洁: - /

1 个答案:

答案 0 :(得分:0)

不幸的是,目前还没有像SignalR中的Groups.Add("userName", "groupName");这样的方法。

我建议将用户添加到OnConnected中的相应群组:

public class MyHub : Hub
{
    public override async Task OnConnected()
    {
        var userName = MyUserHelper.GetUserId(Context.Request);

        foreach (var groupName in GroupManager.GetJoinedGroups(userName))
        {
            await Groups.Add(Context.ConnectionId, groupName);
        }
    }

    // ...
}

如果您需要将已连接的用户添加到群组,则可能需要使用Clients.User(userName).joinGroup(groupName)之类的内容向用户发送消息。然后,userName的每个客户都可以调用相应的中心方法加入groupName