Сообщения Signalr не передаются при использовании объединительной платы Redis - PullRequest
4 голосов
/ 28 мая 2020

У нас есть приложение, которое использует SignalR для отправки sh сообщений клиенту из приложения ASP. NET MVC. Функциональность pu sh ранее работала, но при попытке добавить объединительную плату Redis уведомления больше не отправляются клиенту. Чтобы передать sh данные, у нас есть этот код на стороне сервера:

public class SignalrDataSync : IDataSync
{
    private readonly IHubContext _hubContext;

    public SignalrDataSync(IHubContext hubContext)
    {
        _hubContext = hubContext;
    }

    public void UpdateSitePartForUser(TmoUser user, SitePart sitePart)
    {
        var connection = GetConnectionForUser(user);
        var view = SitePartViewModel.FromEntity(sitePart);
        connection.Invoke("updateClient", view);
    }

    private IClientProxy GetConnectionForUser(TmoUser user) => _hubContext.Clients.Group(user.UserName);
}

Как видите, мы отправляем sh данные в группу, которая является именем пользователя. Данные - это сущность, которая перед отправкой преобразуется в модель представления. Чтобы настроить объединительную плату, мы добавляем в конфигурацию, которая является частью запуска приложения:

public class SignalrBootstrapper
{
    public void Configuration(IAppBuilder app)
    {
        var scaleoutConfig = new RedisScaleoutConfiguration(ConnectionStrings.Redis, "CandidateSignalrBackplane");
        GlobalHost.DependencyResolver.UseStackExchangeRedis(scaleoutConfig);

        // Any connection or hub wire up and configuration should go here
        app.MapSignalR();
    }
}

Я включил трассировку в SignalR и вижу, как клиент подключается и присоединяется к правильной группе, см. Журналы шины сообщений ниже ( группа здесь FRED1003):

SignalR.ScaleoutMessageBus Информация: 0: OnReceived (0, 77, 1) SignalR.ScaleoutMessageBus Verbose: 0: Получено сообщение 77: '{"WaitForAck": false, «Id»: «e2786caa-df1b-4892-bfa3-4909ebb82624», «CommandType»: 0, «Value»: null} 'через ScaleoutMessageBus SignalR.ScaleoutMessageBus Verbose: 0: Идентификатор сообщения: 77, поток: 0, eventKey:' c -21075c00-9430-48da-91c1-4250ac117407 'сохранено с локальным идентификатором: 0 SignalR.ScaleoutMessageBus Verbose: 0: Ключи событий планирования: c -21075c00-9430-48da-91c1-4250ac117407

SignalR .ScaleoutMessageBus Информация: 0: OnReceived (0, 78, 1) SignalR.ScaleoutMessageBus Verbose: 0: Полученное сообщение 78: '{"WaitForAck": true, "Id": "20d69878-d5d4-467a-acf5-eabe75160729", " CommandType ": 1, «Value»: «hg-SyncHub.FRED1003»} 'поверх ScaleoutMessageBus SignalR.ScaleoutMessageBus Verbose: 0: Идентификатор сообщения: 78, поток: 0, eventKey:' c -21075c00-9430-48da-91c1-4250ac117407 'сохранено с локальный идентификатор: 1 SignalR.ScaleoutMessageBus Verbose: 0: Планирование ключей событий: c -21075c00-9430-48da-91c1-4250ac117407

SignalR.ScaleoutMessageBus Информация: 0: OnReceived (0, 79, 1) SignalR. ScaleoutMessageBus Verbose: 0: Получено сообщение 79: '' over ScaleoutMessageBus SignalR.ScaleoutMessageBus Verbose: 0: Идентификатор сообщения: 79, поток: 0, eventKey: ' SIGNALR__SERVER ' сохранено с локальным идентификатором: 0 SignalR.ScaleoutseboMessageBus : 0: Планирование ключей событий: SIGNALR__SERVER

SignalR.ScaleoutMessageBus Информация: 0: OnReceived (0, 80, 1) SignalR.ScaleoutMessageBus Verbose: 0: Получено сообщение 80: '{"WaitForAck" : true, "Id": "668e5f76-e305-41a4-90a3-deb494b95fb9", "CommandType": 2, "Value": "hg-SyncHub.FRED1003"} 'поверх ScaleoutMessageBus SignalR.ScaleoutMessageBus Verb ose: 0: идентификатор сообщения: 80, поток: 0, eventKey: 'c -0abd061f-e00f-42c1-b245-fa49903c53b c' сохранен с локальным идентификатором: 2 SignalR.ScaleoutMessageBus Verbose: 0: Планирование ключей событий: c -0abd061f-e00f-42c1-b245-fa49903c53b c

Поскольку это происходит, я могу сказать, что соединение с экземпляром redis работает (я также пытался подключиться к redis вручную и подписавшись на канал и может видеть эти сообщения, приходящие, когда клиент подключается). Однако при попытке получить данные pu sh ничего не попадает в redis, поэтому ничего не достигает клиента.

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