Определите состояние соединения Signal R без широковещательной рассылки Clients.All.someMethod () и без использования ресурсов на стороне клиента - PullRequest
0 голосов
/ 09 ноября 2018

Меня беспокоит использование Clients.All в моем классе C # Signal R

Clients.All.setConnectionStatus(profileId, true);

Я звоню как в OnConnected(), так и OnDisconnected(bool stopCalled) чтобы показать онлайн статус моих зарегистрированных пользователей. OnDisconnected() не так плохо, потому что он вызывается только когда кто-то действительно выходит из системы

ех.

public override Task OnConnected()
{
   string profileId = Context.User.Identity.Name;
   _connections.Add(profileId, Context.ConnectionId);
    Clients.All.setConnectionStatus(profileId, true);
    return base.OnConnected();
 }

public override Task OnDisconnected(bool stopCalled)
{
    string profileId = Context.User.Identity.Name;
    _connections.Remove(profileId, Context.ConnectionId);
    if (stopCalled == false) // log off only
        Clients.All.setConnectionStatus(profileId, false);
     return base.OnDisconnected(stopCalled);
}

Моя проблема -> Взрыв клиентской части компьютера пользователя с помощью JavaScript-кода, постоянно работающего в браузере!

Сценарий -> Если у меня есть> ~ 1000 пользователей в сети и вошли в систему, переходя на разные страницы, я буду транслировать всем им сигнал R-соединения Clients.All.setConnectionStatus(profileId, true);

, который в концентраторе javascript выглядит следующим образом, что может легко привести к тому, что браузер пользователя будет взорван, потому что он будет постоянно получать эти вызовы статуса подключения к широковещательной рассылке !!!

scope.chat = $.connection.chatHub;

// Receive and set the connection status
scope.chat.client.setConnectionStatus = function(profileId, isConnected) {
  // look for prfileId in html
  var $profileStatusElement = $(".online-status-profile[data-id='" + profileId + "']");
  var $profileChatElement = $(".online-status-chat[data-id='" + profileId + "']");
  
  if (isConnected === true) {
    // change the online status
  } else {
    // change the online status
  }
};

У меня есть окна чата для пользователей (онлайн), как показано ниже, где отображается статус пользователя рядом с его именем. Итак, я знаю, находится ли человек, которому я отправляю сообщение, онлайн или нет!

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

enter image description here

Должен ли быть лучший способ, чем транслировать сигнал «всем» онлайн-пользователям на моем сайте? Но единственный способ, которым я могу придумать, - это периодически опрашивать статус на каком-то таймере JavaScript, но я ненавижу эту идею !!

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

К вашему сведению -> У меня также есть страница сообщений, которая показывает список всех недавних бесед с пользователями, как показано ниже. И на этой странице я показываю онлайн статус этих пользователей. На этой странице я извлекаю онлайн-статус каждого пользователя на сервере перед тем, как отображать страницу, так же, как окно чата, но как только страница загружена, до OnConnected() и OnDisconnected(bool stopCalled) можно установить онлайн-статус каждый пользователь на странице.

enter image description here

1 Ответ

0 голосов
/ 14 ноября 2018

Вы делаете правильно с signalR. Я направляю вас на основе ваших проблем / сценариев:

Моя проблема -> Взрывать клиентскую часть компьютера пользователя с помощью javascript код постоянно работает в браузере!

Не забывайте, что вы используете основную функциональность браузера (WebSocket), поэтому у нас нет выбора, если только не выполнит код js на загруженной клиентом странице . Здесь вы можете воспользоваться возможностями браузера.

Сценарий -> Если у меня есть> ~ 1000 пользователей в сети и вошли в систему, переходя к разные страницы, я буду транслировать им всем сигнал R соединение Clients.All.setConnectionStatus(profileId, true);

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

Если вы работаете в общедоступном чате (который может содержать большое количество людей), используя стратегии на стороне сервера, вы просто превращаете свой код в грязный! Да, любой пользователь, который перемещается по странице или обновляет ее, может вызвать избыточное обновление для всех клиентов. Лучшее решение - , превращающее вашу страницу в SPA (работа с вызовом API или вызовом Ajax) без обновления страницы. Я считаю, что любое веб-приложение реального времени должно использовать преимущества современных веб-технологий . Это решит практически все проблемы, с которыми вы столкнулись (например, без обновления страницы, без повторного запуска, без отключения и т. Д.).

Такие решения, как использование таймера js для получения последнего статуса для пользователей, не являются чистыми или нежелательными.

...