SignalR клиент не получает сообщения через MassTransit

У меня есть проблема с отправкой сообщений клиентам SignalR через MassTransit. Всё сделано согласно документации.

Есть Сервис А, который генерирует событие. Данное событие через MassTransit ловит Сервис Б. Далее Сервис Б должен сделать рассылку клиентам SignalR. Так вот Событие успешно доходит до сервиса Б и он якобы делает рассылку клиентам SignalR. Но до клиентов сообщение не доходит.

Ссылка на пример проекта

Что-то я видимо делаю не так или не до конца понимаю как работает MassTransit + SignalR. Если кто сталкивался, подскажите в чем может быть проблема?


Ответы (1 шт):

Автор решения: Georgy

чтобы выполнить рассылку клиентам SignalR, вам нужно:

  1. Внедрить зависимость из SignalR (IHubContext) в класс-обработчик сообщения MassTransit (BroadcastMessageConsumer)
  2. При получении сообщения (Метод Consume) выполнить рассылку в необходимый хаб SignalR
  3. Написать клиентский код для подключения к хабу SignalR (TypeScript, JS, C#)
  4. Ожидать в клиенте вызов метода client_side_method_name()

Ваш код Потребителя сообщений на сервере будет выглядеть примерно так:

    public class BroadcastMessageConsumer : IConsumer<BroadcastMessageModel>
    {
    
        private readonly IHubContext<YourHub> _hubContext;
    
        public BroadcastMessageConsumer(IHubContext<YourHub> hubContext)
        {
            _hubContext = hubContext;
        }
    
        public Task Consume(ConsumeContext<BroadcastMessageModel> context)
        {
    
            _hub.Clients.All.SendAsync("client_side_method_name", "your data");
    
            return Task.CompletedTask;
        }
    }

Код клиента:

    ngOnInit(): void
    {
        this.getEmployeeData();
    
        const connection = new signalR.HubConnectionBuilder()
            .withUrl('http://localhost:5000/yourHub')
            .build();
    
        connection.start().then(function() {
            console.log('SignalR Connected!');
        }).catch (function (err) {
            return console.error(err.toString());
        });
    
        connection.on("client_side_method_name", () => {
            this.doSomething();
        });
        }
    
    doSomething() { }
→ Ссылка