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