2014-02-14 3 views
0

Я пытаюсь вернуть счет всех подключений к веб-клиенту с помощью SignalR. Я увеличиваю и сохраняю счет клиента с помощью логики запуска на концентраторе OnConnected().Возврат количества подключенных клиентов в SignalR. Не запускать функцию клиента

public class PopHub : Hub 
{ 
    public static List<string> Users = new List<string>(); 

    public override Task OnConnected() 
    { 
     var clientId = GetClientId(); 

     if (Users.IndexOf(clientId) == -1) 
     { 
      Users.Add(clientId); 
     } 

     Send(Users.Count); 

     return base.OnConnected(); 
    } 

    public void Send(int count) 
    { 
     Clients.All.updateUsersOnlineCount(count); 
    } 

пошаговый мой код с внешним клиентом консоли (для запуска OnConnected()) показывает, что я обход через Send(int count) с отсчетом 1.

На моем вебе-клиенте, настроить мой JS как таковой

$(function() { 
    var hub = $.connection.popHub; 

    hub.client.updateUsersOnlineCount = function(count) { 
     console.log(count); 
    }; 

    $.connection.hub.start().done(function() { 
     console.log('connected'); 
    }); 
}()); 

И, наконец, мой отрывок из сгенерированного JS

proxies.popHub = this.createHubProxy('popHub'); 
    proxies.popHub.client = { }; 
    proxies.popHub.server = { 
     popClient: function (message) { 
      return proxies.popHub.invoke.apply(proxies.popHub, $.merge(["PopClient"], $.makeArray(arguments))); 
     }, 

     query: function() { 
      return proxies.popHub.invoke.apply(proxies.popHub, $.merge(["Query"], $.makeArray(arguments))); 
     }, 

     send: function (count) { 
      return proxies.popHub.invoke.apply(proxies.popHub, $.merge(["Send"], $.makeArray(arguments))); 
     } 
    }; 

** Обратите внимание, что Popclient и Query являются событиями, не связанными с сервером, из которых действительно работают, давая мне некоторую проверку. Любая идея, почему мои клиенты updateUsersOnlineCount функция не регистрирует количество подключений, как я ожидаю?

+0

Это, вероятно, не то, что вызывает 'updateUsersOnlineCount' не войти, но вы не должны модифицировать статический список внутри OnConnected. Коллекции, найденные в пространстве имен System.Collections.Generic, не являются потокобезопасными. Вместо этого используйте коллекцию из пространства имен System.Collections.Concurrent, например [ConcurrentBag ] (http://msdn.microsoft.com/en-us/library/dd381779.aspx). – halter73

ответ

0

Вместо того, чтобы делать это в OnConnected, попробуйте попробовать, возможно, Base.OnConnected еще не выполнен, поэтому он не готов к трансляции клиентам.

//Client 
$.connection.hub.start().done(function() { 
     console.log('connected'); 
     hub.server.ClientCount(); 
    }); 

//Hub 
public static List<string> Users = new List<string>(); 

public override Task OnConnected() 
{ 
    var clientId = GetClientId(); 

    if (Users.IndexOf(clientId) == -1) 
    { 
     Users.Add(clientId); 
    } 

    //Send(Users.Count); //not calling this since it's not working 

    return base.OnConnected(); 
} 
public void ClientCount() 
    { 
     Clients.All.updateUsersOnlineCount(Users.Count); 
    } 
+0

Отлично, я попробую, когда вернусь к своему источнику в понедельник. спасибо – scniro

Смежные вопросы