SignalR (оригинал) не отправляет сообщения клиенту - PullRequest
2 голосов
/ 07 ноября 2019

Мы используем SignalR (оригинал, а не версию Core) и замечаем какое-то необъяснимое поведение. Наша ситуация выглядит следующим образом:

  1. У нас есть концентратор, который принимает команды через метод GenericCommand () (см. Ниже).
  2. Эти команды размещаются на шине сообщений с использованием NServiceBus * 1006. *
  3. Выполнение команды приводит к событию
  4. Обработчик события приводит к отправке сообщения всем клиентам SignalR (см. Ниже)

Использование инструментов отладчика вChrome для просмотра сообщений Websocket становится ясно, что иногда (но не всегда) сообщение «InvokeToAll» никогда не отправляется ни одному из клиентов. Не выдается никакой ошибки, и все подключенные клиенты просто отправляют свои сигналы пульса, указывающие, что они все еще подключены.

Кроме того, журналы трассировки (см. Ниже) на сервере указывают, что соединение явно активно все время, но по какой-то причине три тестовых сообщения «Получено», которые отправляются сразу из концентратора, отправляются обратно. для клиентов, но результирующий «InvokeToAll», отправленный из обработчика событий, по какой-то причине не отправляется с помощью Websocket. Мы знаем, что обработчик события вызывается, потому что вызов _notificationService.MarkAsDone() оставляет следы в базе данных, подтверждая, что он вызван.

И последнее, что мы заметили, это то, что эта установка работает и работает, пока не работает. Как только сообщения перестают отправляться клиентам, они останавливаются для всех клиентов в любое время. Мы полностью в растерянности относительно того, что могло бы произойти, или что еще мы можем сделать для дальнейшей отладки. Не выдается никаких ошибок, и что-то, что работает, внезапно перестает работать без уведомления ...

Любая помощь или указатели будут с благодарностью.

Вот код для Hub (шаг 1):

public async Task GenericCommand(GenericEventData data) {
    await _messageBus.PublishEvent(new GenericSignalrCommandReceivedEvent {
        CorrelationId = Guid.Parse(data.CorrelationId),
        Command = data.Command,
        DataJson = data.DataJson,
        ConnectionId = Context.ConnectionId
    });

    // Added for debugging purposes
    var ctx = GlobalHost.ConnectionManager.GetHubContext<EventHub>();
    IClientProxy proxy = ctx.Clients.Client(Context.ConnectionId);
    await proxy.Invoke(data.CorrelationId, "Received - ConnectionId");

    proxy = ctx.Clients.User(Context.User.Identity.Name);
    await proxy.Invoke(data.CorrelationId, "Received - Clients.User");
    proxy = ctx.Clients.Group("JCUSER:" + Context.User.Identity.Name);
    await proxy.Invoke(data.CorrelationId, "Received - Clients.Group");
}

А вот код для обработчика событий (шаг 4)

private async Task ReplyViaSignalR(SignalrCompletedData data, IMessageHandlerContext context) {
    var ctx = GlobalHost.ConnectionManager.GetHubContext<EventHub>();
    var proxy = ctx.Clients.All;
    await proxy.Invoke("InvokeToAll", "Yay message received!");
    await _notificationService.MarkAsDone(data);
}

Вот выдержка из журнала трассировки на сервере для подключения этого клиента:

SignalR.Transports.TransportHeartBeat Information: 0 : Connection 1d603a67-1161-4a27-82f0-9046ec73cd60 is New.
SignalR.Transports.WebSocketTransport Verbose: 0 : Sending outgoing message. Connection id: 1d603a67-1161-4a27-82f0-9046ec73cd60, transport: WebSocketTransport, message: {"C":"d-498F7600-B,15|rS,0|pP,A|rT,1","S":1,"M":[]}
SignalR.Transports.WebSocketTransport Verbose: 0 : Sending outgoing message. Connection id: 1d603a67-1161-4a27-82f0-9046ec73cd60, transport: WebSocketTransport, message: {"C":"d-498F7600-B,15|rS,0|pP,A|rT,2|pR,1E","G":"F2q+KKxufchVxQUnH9leeyYR6fGPfHYRCIQW55XZbNEbbibRlbVYld/b0fzihC34VrDwmoaNy2uTJYnRCeQO9zGEoqNk+9qbAi72dPep52CgpicyPGQOlvNzUOlNK1v2j34SdPXHI8DwpDwx/7SA317XJMJPxrCE5Qsgt/kgTzE=","M":[]}
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(1d603a67-1161-4a27-82f0-9046ec73cd60)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(1d603a67-1161-4a27-82f0-9046ec73cd60)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(1d603a67-1161-4a27-82f0-9046ec73cd60)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(1d603a67-1161-4a27-82f0-9046ec73cd60)
SignalR.Transports.WebSocketTransport Verbose: 0 : Sending outgoing message. Connection id: 1d603a67-1161-4a27-82f0-9046ec73cd60, transport: WebSocketTransport, message: {"C":"d-498F7600-B,1F|rS,5|pP,19|rT,2|pR,43","M":[{"H":"EventHub","M":"a1ec2fa6-f33c-4161-9166-07ee64558be1","A":["Received - ConnectionId"]},{"H":"EventHub","M":"a1ec2fa6-f33c-4161-9166-07ee64558be1","A":["Received - Clients.User"]}]}
SignalR.Transports.WebSocketTransport Verbose: 0 : Sending outgoing message. Connection id: 1d603a67-1161-4a27-82f0-9046ec73cd60, transport: WebSocketTransport, message: {"C":"d-498F7600-B,1F|rS,5|pP,19|rT,2|pR,44","M":[{"H":"EventHub","M":"a1ec2fa6-f33c-4161-9166-07ee64558be1","A":["Received - Clients.Group"]}]}
SignalR.Transports.WebSocketTransport Verbose: 0 : Sending outgoing message. Connection id: 1d603a67-1161-4a27-82f0-9046ec73cd60, transport: WebSocketTransport, message: {"I":"4"}
SignalR.Transports.WebSocketTransport Verbose: 0 : Sending outgoing message. Connection id: 1d603a67-1161-4a27-82f0-9046ec73cd60, transport: WebSocketTransport, message: {"C":"d-498F7600-B,1F|rS,5|pP,19|rT,2|pR,45","M":[]}
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(1d603a67-1161-4a27-82f0-9046ec73cd60)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(1d603a67-1161-4a27-82f0-9046ec73cd60)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(1d603a67-1161-4a27-82f0-9046ec73cd60)

1 Ответ

0 голосов
/ 08 ноября 2019

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

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

Мы планируем изменить эту ситуацию, просто объединив привязки к одному и тому же экземпляру веб-сайта, когда у нас будет такая возможность. Я полностью ожидал, что проблема будет решена тогда.

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