Есть ли способ получить количество соединений в группе хабов Signalr? - PullRequest
7 голосов
/ 02 апреля 2012

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 09 апреля 2012

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

4 голосов
/ 22 октября 2012

Нашел, как обойти:

Переписать 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());

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...