Меня беспокоит использование 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()
, чтобы установить онлайн-статус человека, с которым я общаюсь.
Должен ли быть лучший способ, чем транслировать сигнал «всем» онлайн-пользователям на моем сайте? Но единственный способ, которым я могу придумать, - это периодически опрашивать статус на каком-то таймере JavaScript, но я ненавижу эту идею !!
Другим способом было бы сохранить некоторую коллекцию в памяти того, с кем каждый человек общается, но кажется, что это может стать очень грязным и в итоге может быть не очень точным, потому что может быть так много вещей между клиентом и сервером, что может привести к неправильному управлению сбором в памяти того, кто с кем связан! Любые мысли или идеи здесь будет принята с благодарностью !!
К вашему сведению -> У меня также есть страница сообщений, которая показывает список всех недавних бесед с пользователями, как показано ниже. И на этой странице я показываю онлайн статус этих пользователей. На этой странице я извлекаю онлайн-статус каждого пользователя на сервере перед тем, как отображать страницу, так же, как окно чата, но как только страница загружена, до OnConnected()
и OnDisconnected(bool stopCalled)
можно установить онлайн-статус каждый пользователь на странице.