我想也许我不完全理解在SignalR中实现组的正确方法:)
我正在使用一个与一些JS配合的SignalR集线器。 相关代码如下:
public class NotificationHub : Hub
{
public void RegisterUser()
{
if (Context.User.Identity.IsAuthenticated)
{
var username = Context.User.Identity.Name;
Groups.Add(Context.ConnectionId, username);
//check roles
var roles = Roles.GetRolesForUser(username);
foreach (var role in roles)
{
Groups.Add(Context.ConnectionId, role);
}
}
}
public override Task OnConnected()
{
RegisterUser();
return base.OnConnected();
}
//rejoin groups if client disconnects and then reconnects
public override Task OnReconnected()
{
RegisterUser();
return base.OnReconnected();
}
}
单步执行此代码表明它按预期工作。
当我真正来发送消息时,广播到所有工作。如果我尝试通过用户名(他们自己的特定组)向特定用户广播,则不会发生任何事情。
public void BroadcastNotification(List<string> usernames, Notification n)
{
var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
foreach (var username in usernames)
{
context.Clients.Group(username).broadcastMessage(new NotificationPayload()
{
Title = n.Title,
Count = UnitOfWork.NotificationRepository.GetCount(),
Notification = n.Body,
Html = RenderPartialViewToString("_singleNotification", n)
});
}
}
看起来群体不像我想象的那样工作。我在这里缺少一步吗?
答案 0 :(得分:0)
我没有看到您的客户端代码,但我认为您必须明确启动集线器,并在收到“通知”之前“加入”“组”。所以在您的客户端代码中,类似
$.connection.hub.start()
.done(function() {
chat.server.join();
});
并在您的集线器中,使用“加入”方法,就像您已经拥有的那样:
public Task Join()
{
if (Context.User.Identity.IsAuthenticated)
{
var username = Context.User.Identity.Name;
return Groups.Add(Context.ConnectionId, username);
}
else
{
// a do nothing task????
return Task.Factory.StartNew(() =>
{
// blah blah
});
}
}