SignalR:群组广播不起作用

时间:2013-05-13 14:56:15

标签: c# signalr

我想也许我不完全理解在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)
            });
        }

    }

看起来群体不像我想象的那样工作。我在这里缺少一步吗?

1 个答案:

答案 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 
        });
    }   
}