Таргетинг на конкретного пользователя в группе

ASP.NET Core SignalR

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

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

Судя по тому, как SignalR работает внутри, это должно быть возможно, но вероятно, что такой метод не был раскрыт.

Пример использования: предположим, что у вас есть чат-группы с группой людей, и вы хотите отправить определенное системное сообщение одному из пользователей в группе. Например, предположим, что серверу необходимо случайным образом выбрать одного из пользователей в группе и отправить ему секретный код для игры, который другие не должны знать (предположим, что на сервере уже есть список всех пользователей в группе и это не меняется, могут меняться только соединения). Сообщение должно отправляться конкретному пользователю, но не всем его подключениям. У него могут быть другие связи, которые активны для другой чат-группы, поэтому мы не хотим уведомлять эти связи. Мы хотим настроить таргетинг только на соединения, принадлежащие этому пользователю, которые в настоящее время являются частью определенной чат-группы.

Я использую службу Azure SignalR в бессерверном режиме с приложениями-функциями Azure NodeJS. Также могут помочь ответы для режима сервера по умолчанию в C #.


person Codi    schedule 08.12.2020    source источник
comment
Также добавлена ​​проблема на github - github.com/Azure/azure-signalr/issues/ 1144   -  person Codi    schedule 08.12.2020
comment
Есть аналогичный вопрос, но .NET Core SignalR значительно отличается от .NET SignalR 5 лет назад - stackoverflow.com/questions/34381104/   -  person Codi    schedule 08.12.2020
comment
Эти шаги могут объяснить, как отправить сообщение через сигнализатор.   -  person u1986237    schedule 09.12.2020


Ответы (1)


Решение состоит в том, чтобы создать группу, которая представляет собой комбинацию имени базовой группы и идентификатора пользователя (например: secondaryGroup = group + "::" + user).

Помимо добавления пользователя / соединения в базовую группу, добавьте пользователя также в эту вторичную группу (в дополнение к базовой группе).

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

Чтобы настроить таргетинг на всех пользователей в группе, используйте имя базовой группы.
Чтобы настроить таргетинг на конкретного пользователя в группе, используйте имя дополнительной группы.

Это значительно увеличит количество групп, но не окажет значительного влияния на нагрузку / производительность.

См. Статью о проблеме GitHub (ссылка на которую приведена в комментариях к вопросу) для получения более подробной информации.

person Codi    schedule 10.12.2020