Разделенные события SignalR для нескольких концентраторов

Я пытаюсь настроить для них концентраторы SignalR и отдельные события OnDisconnected.

Ради вопроса, на какой-то странице у меня есть два Хаба:

  1. StatusHub: обрабатывает статус пользователя на веб-сайте. Методы этого концентратора вызываются на каждой странице веб-сайта и обрабатывают логику подключения и отключения пользователя для обновления статуса пользователя при его перемещении по веб-сайту.

  2. ChatHub: Обрабатывает все, что связано с чатом на сайте в режиме реального времени. Методы этого хаба вызываются только с определенной страницы веб-сайта, когда пользователь нажимает определенные кнопки.

Проблема, с которой я сталкиваюсь, заключается в том, что, несмотря на то, что оба класса концентраторов реализуют свои собственные версии методов OnConnected и OnDisconnected, запускаются только методы StatusHub, а методы ChatHub не вызываются.

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

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

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

StatusHub.cs

public class StatusHub : Hub { 
    public override Task OnDisconnected()
    {
        //handles the disconnected event as needed
        return base.OnDisconnected();
    }


    public override Task OnConnected()
    {
        //handles the connected event as needed
        return base.OnConnected();
    }
}

ChatHub.cs

public class ChatHub : Hub { 
    public override Task OnDisconnected()
    {
        //should handle the chat disconnected event but is never reached
        return base.OnDisconnected();
    }


    public override Task OnConnected()
    {
        //should handle the chat connected event but is never reached
        return base.OnConnected();
    }
}

Код, запускающий соединение с хаб-сервером (выполняется на каждой странице):

$.connection.hub.start().done(function() {
    //a lot of code here (irrelevant to the question I think)
});

person BrunoPugliese    schedule 11.11.2013    source источник
comment
Все еще ищу ответ, если кто знает   -  person BrunoPugliese    schedule 25.04.2014


Ответы (1)


Вы решили это? То, что вы описываете, очень похоже на проблему с отсутствием регистрации какого-либо клиентского метода для ChatHub. Когда клиентские методы не зарегистрированы, клиент может вызвать метод концентратора на сервере и получить результат (очень похоже на природу запроса-ответа протоколов без сохранения состояния), но поскольку у сервера нет возможности вызвать что-либо на клиент без запроса на предоставление ответа (с помощью клиента, вызывающего метод концентратора), по замыслу такие подключения не вызывают перегрузок OnConnected, OnReconnected и OnDisconnected.

Решение довольно простое, достаточно зарегистрировать нерабочий клиентский метод следующим образом:

$(function()
{
  // A no-op client method so the hub's
  // OnConnected, OnReconnected and OnDisconnected method overloads are triggered.
  $.connection.chatHub.client.noop = function () { };
  $.connection.hub.start()
    .done(function() { console.log("SignalR connection is up and running."); })
    .fail(function(error) { console.log(error); });
});

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

person Tomáš Hübelbauer    schedule 24.10.2014
comment
Обратите внимание, что правильный синтаксис для этого: $.connection.chatHub.client.noop = function () { };, поэтому вам нужно установить метод noop для клиентского свойства концентратора. - person Kovács Ede; 03.04.2016