Search code examples
javascriptc#signalrsignalr-hubsignalr-2

SignalR working with groups is not working correctly


I work with signalR. Group functionality is not working correctly.

Here it is my hub:

public class BasketHub : Hub
{
    public void Login(int companyId)
    {
        string groupName = "company" + companyId;

        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<BasketHub>();

        context.Groups.Add(Context.ConnectionId, groupName);
    }

    public void Logout(int companyId)
    {
        string groupName = "company" + companyId;

        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<BasketHub>();

        context.Groups.Remove(Context.ConnectionId, groupName);
    }
}

Here it is using server side:

  public void OrderConfirm(OrderConfirmModel orderConfirmModel)
  {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<BasketHub>();

        var groupName = "company" + orderConfirmModel.CompanyId;

        context.Clients.Group(groupName).orderConfirm(orderConfirmModel.DidNewOrder);

        context.Clients.Group(groupName).newOrderCount(orderConfirmModel.DidNewOrder);

        context.Clients.Group(groupName).didGetNotification(orderConfirmModel.BasketId);
  }

Here it is client:

       $(function () {
        var basketHub = $.connection.basketHub;

        basketHub.client.newOrderCount = function (isNewOrder) {
            // some code
        }

        basketHub.client.didGetNotification = function (basketId) {
            // some code
        }

        basketHub.client.orderConfirm = function (isNewOrder) {
             // some code
        }

        $.connection.hub.start();
    });

Here it is group add and remove client:

    $(function () {
    var basketHub = $.connection.basketHub;

    $.connection.hub.start().done(function () {
        basketHub.server.login($scope.Company.Id);

        $('#logoutBtn').click(function () {
            basketHub.server.logout($scope.Company.Id);
        });
    });

    $(window).bind('beforeunload', function (e) {
        basketHub.server.logout($scope.Company.Id);
    });
});

I created the group on BasketHub's context. However, when i try to use that group, i dont reach it. And there are no triggered notifications on client side.

I can use it like below:

context.Clients.All.orderConfirm(orderConfirmModel.DidNewOrder);
context.Clients.All.newOrderCount(orderConfirmModel.DidNewOrder);
context.Clients.All.didGetNotification(orderConfirmModel.BasketId);

Best Regards.


Solution

  • I found a solution. Write an angular controller which run init every page load (like layout-controller). I define my hub here and emit functions. SingnalR groups work fine.

        $(function () {
        var basketHub = $.connection.basketHub;
    
        basketHub.client.orderConfirm = function (isNewOrder) {
            $rootScope.$emit("basketOrderConfirm", isNewOrder);
        }
    
        basketHub.client.newOrderCount = function (isNewOrder) {
            $rootScope.$emit("newOrderCount", isNewOrder);
        }
    
        basketHub.client.didGetNotification = function (basketId) {
            $rootScope.$emit("didGetNotification", basketId);
        }
    
        $.connection.hub.start().done(function () {
            basketHub.server.login($scope.Company.Id);
    
            $('#logoutBtn').click(function () {
                basketHub.server.logout($scope.Company.Id);
            });
        });
    
        $(window).bind('beforeunload', function (e) {
            basketHub.server.logout($scope.Company.Id);
        });
    });