Как получить уведомление только о нескольких товарах от signalR? (EF ядро ​​и Angular 8) - PullRequest
0 голосов
/ 12 марта 2020

В нашем ядре. Net и Angular 8 мы реализовали SignalR. Нам нужны уведомления в реальном времени о различных событиях.

События (в нашем приложении) - это динамически создаваемый элемент. (День рождения, юбилей и др. c)

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

В настоящее время уведомление от всех событий распространяется на всех клиентов (независимо от событий, которые они открыли)

public class NotificationHub : Hub    {
    public async Task UpdateVote(int eventId, int pollId, int pollOptionId)
    {
        await Clients.Others.SendAsync("VoteUpdated", eventId, pollId, pollOptionId);
    }
}

Angular:

private CreateConnection() {
    this._hubConnection = new HubConnectionBuilder()
      .withUrl(environment.base + 'NotificationHub')
      .build();
  }

  private StartConnection(): void {
    this._hubConnection
      .start()
      .then(() => {
        this.connectionIsEstablished = true;
        console.log('Hub connection started');
        this.connectionEstablished.emit(true);
      })
      .catch(err => {
        console.log('Error while establishing connection, retrying...');
        setTimeout(function () { this.StartConnection(); }, 5000);
      });
  }

UpdateVote(eventId, pollId, pollOptionId) {
    this._hubConnection.invoke('UpdateVote', eventId, pollId, pollOptionId);
  }

private RegisterOnServerEvents(): void {
    this._hubConnection.on('VoteUpdated', (eventId, pollId, pollOptionId) => {
      this.VoteUpdated.emit({ eventId, pollId, pollOptionId });
    });
  }

I открываю соединение при загрузке сайта.

Что мне нужно реализовать, чтобы клиенты были уведомлены только о событиях, которые они открыли?

1 Ответ

2 голосов
/ 12 марта 2020

Добавьте их в группу. Например, всякий раз, когда пользователь посещает событие, добавляйте его в группу, такую ​​как «Event-» + eventId, и когда происходит изменение, уведомляйте только эту группу. Не забудьте удалить из группы, когда они закрывают эту страницу

public async AddToTrackGroup(string eventId) {
        return Groups.Add(Context.ConnectionId, "event-" + eventId);
}

public async Task UpdateEventViewer(string eventId)
{
    Clients.Group("event-" + eventId).notifyEventChanged();
}
...