2014-09-03 2 views
0

Я пишу веб-приложение и использует SignalR. На сервере C# у меня есть два концентратора. На самом деле это должно быть два, иначе я бы просто объединил их и решил проблему.Сторона сервера Signalr, OnDisconnect вызывает только 1 концентратор

Проблема, с которой я столкнулся, заключается в том, что, хотя я знаю, что клиентская сторона SignalR, концентраторы будут совместно использовать соединение. Проблема, с которой я сталкиваюсь, заключается в том, что когда я закрываю браузер или останавливаю вызов на клиенте. Только один из моих событий OnDisconnect (bool stopCalled) на моей стороне будет срабатывать.

Я как-то ожидал, что оба будут срабатывать, когда клиент отключится.

Могу ли я быть глупым или что-то делать неправильно? Любая информация будет принята с благодарностью.

Луи

+0

Согласно Документов (http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs- api-guide-server # onreconnected) OnDisconnected может не вызываться в определенных сценариях.Не зная подробностей о том, как/что вы хотите сделать, когда клиент отключен, вам будет сложно помочь. Если вам действительно нужно иметь «2 соединения» от клиента к серверу одновременно, возможно, используйте группу? Например. ожидают Groups.Add (Context.ConnectionId, "line1"); ожидают Groups.Add (Context.ConnectionId, «строка2»); – alpinescrambler

+0

Привет, я видел эту часть документации, но информация вокруг нее немного отрывочна. В основном у меня есть следующее. У меня на сервере два класса, наследующие от Hub. оба этих класса реализуют методы OnConnect, OnDisconnect. Оба этих класса затем сохраняют детали в HubClientCache. Идентификатор клиента встает при вызове OnConnect и удаляется клиент при вызове OnDisconnect. –

+0

Один хаб обрабатывает не что иное, как довольно сложную систему присутствия пользователей. А второй - для связи между пользователями. В клиенте javascript я дважды вызываю метод запуска. Один для каждого из концентраторов. Оба концентратора на сервере отлично справляются с событием OnConnect на этом этапе. Но при закрытии браузера, например, только один из серверов-концентраторов видит вызванный метод OnDisconnect. –

ответ

0

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

Спасибо за совет, хотя из всех :)

Луи

3

Я думаю, что проблема, которую вы испытываете может быть вызвано не закреплять любые обработчики событий (т.е. методы клиента ступиц) к концентратору, который не вызывает OnDisconnected. Если это действительно является причиной, OnConnected также не должен запускаться в одном концентраторе.

The SignalR Hubs API Guide for the JavaScript client подробно останавливается на одной из своих «заметок» о том, почему это так. Вот соответствующая цитата:

Примечание: Обычно регистрируют обработчик событий перед вызовом метода запуска, чтобы установить соединение. Если вы хотите зарегистрировать некоторые обработчики событий после установления соединения, вы можете это сделать, но перед вызовом метода start вы должны зарегистрировать хотя бы один из ваших обработчиков событий. Одна из причин этого заключается в том, что в приложении может быть много концентраторов, но вы не хотите запускать событие OnConnected для каждого концентратора, если вы собираетесь использовать только один из них. Когда соединение установлено, присутствие клиентского метода на прокси-хабе - это то, что сообщает SignalR запускать событие OnConnected. Если вы не регистрируете обработчики событий перед вызовом метода start, вы сможете вызывать методы на концентраторе, но метод OnConnected хаба не будет вызываться, и никакие клиентские методы не будут вызываться с сервера.

Любая ссылка на метод OnConnected применима в равной степени к методу OnDisconnected.

Вы можете добавить произвольного обработчика событий к своему концентратору до вызова start() на клиенте, чтобы гарантировать, что OnConnected и OnDisconnected будут вызваны в этот концентратор. Неважно, обработчик события никогда не будет вызван. Пример:

$.connection.myHub.client.thisWillNeverBeCalled = function() { }; 

$.connection.hub.start()//... 

Пока первая линия есть, OnConnected и OnDisconnected следует вызывать MyHub.

+0

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

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