javascript – 确定Signal R连接状态,而不广播Clients.All.someMethod()并炸毁客户端资源

我担心使用Clients.All在我的C#Signal R hub类中

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

最佳答案
你正在用signalR做正确的事.我会根据您的顾虑/情景指导您:

My concern -> Blowing up the users machine client side with javascript
code constantly running in the browser!

不要忘记您正在使用浏览器底层功能(WebSocket),因此除非在客户端加载的页面中运行一些js代码,否则我们别无选择.您可以在此处利用浏览器功能.

Scenario -> If I have > ~1000 users online and logged in traversing to
different pages,I will be broadcasting to all of them a signal R
connection Clients.All.setConnectionStatus(profileId,true);

在提出任何解决方案之前,我在您的申请中劝告您到employ grouping logic.分组可减少同步量.

如果您在公共聊天室(可能包含大量人员)工作,通过采用服务器端策略,您只需将代码变为脏代码!是的,导航或刷新页面的任何用户都可能导致对所有客户端进行冗余更新.最佳解决方案是将页面转换为SPA(使用API​​调用或Ajax调用),无需刷新页面.我相信任何实时Web应用程序都应该利用现代Web技术.这将解决您遇到的几乎所有问题(例如,没有页面刷新,没有重新运行,没有disCoennection& etc ……).

像使用js计时器获取用户的最新状态这样的解决方案并不干净或不可取.

相关文章

kindeditor4.x代码高亮功能默认使用的是prettify插件,prett...
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小