Вещательное сообщение всем клиентам, кроме себя в SignalR
Я понимаю, что эти вопросы схожи:
SignalR - широковещательная передача для всех клиентов, кроме вызывающего абонента
Отправить сообщение всем клиентам в группе, за исключением текущего клиента
Однако они старые, и ничто в текущей документации не дало мне никаких указаний относительно того, я делаю то, что я делаю правильно или нет.
Здесь вопрос/проблема:
Мне нужно иметь возможность транслировать сообщение с сервера на все подключенные клиенты, кроме парня, который отправил http-запрос, - представьте, что кто-то отправил форму и связал всех людей с одной формой с уведомлением о том, что что-то было Отправлено.
То, как я это делаю сейчас, выглядит примерно так:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var connectionID = HttpContext.Request.Cookies["conn-id"].Value;
context.Clients.AllExcept(connectionID).addMessage(message);
И каждый раз, когда устанавливается соединение, я устанавливаю ConnectionID в cookie на стороне клиента так:
$.connection.hub.start().done(function(){
$.cookie("conn-id",$.connection.hub.id);
});
Итак, мои вопросы:
-
Является ли это лучшим/единственным подходом, который я могу принять в этом случае? Могу ли я прочитать идентификатор соединения клиента, который отправил запрос из другого места, например hub.Context.ConnectionID
или что-то похожее на способ получения SessionID
из HttpContext.Current.Session.SessionID?
-
Могу ли я установить идентификатор соединения программно, когда клиент подключается, например, установив его в SessionID? Может ли это вызвать проблему по какой-то причине? Если да, можете ли вы объяснить, как программно установить идентификатор соединения и какое событие мне нужно подключить, чтобы сделать это?
Я заметил, что каждый раз, когда страница перезагружается, идентификатор соединения изменяется на другой guid. Как установить ConnectionId только один раз и поддерживать его, по крайней мере, для жизни сеанса?
Ответы
Ответ 1
Ваш подход действительно работает, однако правильный подход заключается в использовании встроенного API: Clients.Others.addMessage(message)
. Также нет необходимости получать контекст концентратора внутри самого концентратора. Вы всегда можете получить доступ к текущему идентификатору соединения через Context.ConnectionId или отправить клиентские клиенты клиентов через Clients.All.foo();
И вы не можете установить ConnectinoID программно. Если вы хотите отслеживать пользователей на разных страницах, поддерживайте список пользователей на вашем сервере, а затем просто повторно назначайте идентификатор соединения при навигации по сайту.
Вот сообщение, объясняющее отслеживание пользователей: бета-соединение SignalR 1.0 factory
Ответ 2
Если вы отправляете сообщение в методе класса Hub, вы также можете использовать Clients.Others для исключения вызывающего клиента. Вам нужно всего лишь использовать AllExcept (id), если вы не используете метод хаба.
Подробнее см. ниже:
http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server#selectingclients