Есть ли способ получить количество соединений в группе хабов Signalr?

Вот моя проблема, я хочу отслеживать, если пользователь онлайн или офлайн и уведомить об этом других клиентов. Я использую концентраторы и реализовал интерфейсы IConnected и IDisconnect.

Моя идея состояла в том, чтобы отправить уведомление всем клиентам, когда концентратор обнаруживает подключение или отключение. По умолчанию, когда пользователь обновляет страницу, он получает новый идентификатор соединения, и, в конце концов, предыдущее соединение будет вызывать разъединение, уведомляя других клиентов, что пользователь находится в автономном режиме, даже если он на самом деле онлайн.

Я попытался использовать свой собственный ConnectionIdFactory, возвращающий имя пользователя для идентификатора соединения, но с несколькими открытыми вкладками в какой-то момент он обнаружит, что пользователь connectionid отключен, и после этого концентратор на стороне клиента попытается безуспешно подключиться к концентратору в бесконечной петле, тратя память и процессор почти непригодным для использования. Мне нужно было исправить это быстро, поэтому я удалил свою фабрику, и теперь я добавляю каждое новое соединение в группу, используя имя пользователя, чтобы я мог легко уведомить одного пользователя о всех соединениях, но тогда у меня есть проблема с определением, подключен ли пользователь к сети или нет, так как я не знаю, сколько у пользователя активного соединения.

Так что мне интересно, есть ли способ получить количество соединений в одной группе? Или, если у кого-то есть идея, как лучше отслеживать, когда пользователь отключается?

Я использую Signalr 0.4

 pajo03 апр. 2012 г., 10:24
Сайт должен работать в сценарии веб-фермы, поэтому я не могу использовать словарь. Я мог бы хранить соединения в БД, но я хотел бы избежать этого, если это возможно.
 drch02 апр. 2012 г., 21:47
Вы можете использовать Dictionary <string, HashSet <string >>, где ключом является имя пользователя, а хэш-набор содержит идентификаторы соединения для этого пользователя. # пользователей = Keys.Count (), # соединений = dict.Values.Sum (x => x.Count ());
 Farrukh Subhani29 нояб. 2012 г., 07:27
Чтобы сказать, как отслеживать онлайн в автономном режиме, я просто храню имя пользователя и connectionID в БД. В другом приложении я создаю группу как роль, чтобы пользователь мог общаться в рамках своей роли или с супер-администратором или ИТ-специалистом, просто зная свою роль. Я использую членство ASP.net и Active Directory. Работает в обоих.
 Farrukh Subhani29 нояб. 2012 г., 07:25
Когда вы говорите, что пользователь обновляет страницу, и он получает новый идентификатор подключения, я сохраняю идентификатор подключения в моей БД, и если пользователь просматривает две страницы на моем сайте, где мой концентратор совпадает, идентификатор подключения также одинаков. Почему вы получаете отдельный идентификатор подключения. Я думаю, что вы можете получить другой идентификатор только тогда, когда клиент отличается.

Ответы на вопрос(1)

перезаписьConnectionIdтак что в каждой вкладке у вас будет одинаковоеConnectionId:

 public class MyConnectionFactory : IConnectionIdGenerator
    {
        public string GenerateConnectionId(IRequest request)
        {
            return MyUserManager.Instance.CurrentUserID.ToString();
        }
    }

Добавьте к global.asax:

GlobalHost.DependencyResolver.Register(typeof(IConnectionIdGenerator), () => new MyConnectionFactory());

Мне удалось открыть столько вкладок, сколько я мог, и все вкладки получают уведомления.

 kravits8824 апр. 2014 г., 10:14
Не работает с последней версией Signalr.
 Mou30 янв. 2015 г., 10:08
Вы можете дать полный код, чтобы понять, как реализовать ConnectionFactory, который является новым для сигнализатора. Спасибо

Ваш ответ на вопрос