【问题标题】:SignalR client disconnect/connect on every refresh of pages. ASP.NET MVCSignalR 客户端在每次刷新页面时断开/连接。 ASP.NET MVC
【发布时间】:2020-12-31 12:16:44
【问题描述】:

我正在创建一个嵌入到我的 asp.net mvc 4 项目中的聊天。我有一个在线用户 ul 列表,它在 OnConnected 上添加一个用户并在 OnDisconnected 上删除它。

所以,我的应用不是 SinglePage 应用,这意味着它一直在页面上刷新。

我在客户端处理此在线用户列表时遇到了一些困难,因为信​​号器在每次页面刷新时都会调用 OnDisconnected 和 OnConnected。

当另一个客户端在应用程序中正常导航时,它会在每次刷新页面时不断被删除和添加。

如何在客户端避免这种行为?


我正在尝试在运行带有 usersOnline 列表的页面的客户端上执行类似操作...

var timeout;

chat.client.login = function (chatUser) {
    addUser(chatUser);
    window.clearTimeout(timeout);
};

chat.client.logout = function (chatUser) {
    timeout = setTimeout(function () { removeUser(chatUser.Id); }, 3000);
};

但我很难处理多用户场景...因为如果多个用户在超时运行之前执行集线器 onDisconnected,则第二个用户将覆盖第一个用户的实例。

【问题讨论】:

  • 你无法避免。导航到新页面是一个新的连接。用户可以有多个连接。
  • 解决方法是大量使用 ajax。使用相同的布局页面,并使用ajax更新页面内容。新的私人聊天窗口、iframe 或其他应附加到正文,以免它们消失。

标签: asp.net-mvc asp.net-mvc-4 signalr


【解决方案1】:

确实没有真正的解决方法。客户端在离开页面时总是会断开连接,并在加载下一页时再次连接到 SignalR。

解决这个问题的唯一方法是创建一个 SPA,因此 SignalR 不需要通过导航来断开连接。

使用 SignalR 集线器的想法是允许以最少的编程或复杂性进行实时操作 - 最好的方法是 SignalR 从当前登录的用户列表中提取,而不是从活动连接中提取,因为这可能会导致同一用户多次。

因此,我建议不要将OnConnectedOnDisconnected 放在AccountController 中,在LogInLogOut 方法中。例如:

public ActionResult LogIn()
{
    //other stuff
    var hub = GlobalHost.ConnectionManager.GetHubContext</*Hub Title*/>();
    hub.client.chat.login()
}

public ActionResult LogOut()
{
    // other stuff
    var hub = GlobalHost.ConnectionManager.GetHubContext</*Hub Title*/>();
    hub.client.chat.logout()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多