2

おそらく、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();
    }

}

このコードをステップ実行すると、意図したとおりに機能することがわかります。

しかし、実際にメッセージを送信するようになると、ALL へのブロードキャストが機能します。ユーザー名 (ユーザー固有のグループ) を介して特定のユーザーにブロードキャストしようとしても、何も起こりません。

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

    }

私が思っていたように、グループは機能しないようです。ここに欠けているステップはありますか?

4

1 に答える 1

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 
        });
    }   
}
于 2013-05-16T21:41:50.327 に答える