使用群组时是否可以使用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代码的整体美观和简洁: - /
答案 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
。