c# - SignalR:如何在页面重新加载时停止创建新连接

标签 c# asp.net-mvc-4 signalr signalr-hub

您好,我正在开发一个聊天应用程序以及我的应用程序中的其他一些页面。一旦我登录,我就会维护用户的 session 。我的主要目的是每当另一个用户连接到服务器时,用户应该得到通知。

我面临的问题是,每当我导航到我的应用程序中的其他页面时,连接就会丢失。如何停止此行为并继续连接直到用户注销。

我在 ASP.NET MVC4 项目中使用 SignalR 2.0,有什么帮助吗??

最佳答案

每个连接只有一个生命周期,持续时间为用户在给定页面上花费的时间。当他们导航到另一个页面时,就会建立一个新的连接。此外,如果一位用户打开了多个选项卡或浏览器窗口,他们将有多个连接 ID。我认为您不想尝试将连接 ID 保留到其预期生命周期之外。

在我处理的类似场景中,我们存储 connectionIds OnConnect 并在 OnDisconnect 中删除它们。当需要向给定用户发送消息时,我们将其发送到他们的所有 connectionId。这可确保将消息传送到所有选项卡/窗口。

编辑 1 以下是对@Saurabh 评论的回应:

考虑 Hub 的范围,以及您的其他类和客户端的范围。 Hub 用于促进浏览器和服务器之间的通信。虽然可以在中心内做很多工作,但我认为最好将通信之外的大部分范围移动到其他地方。

客户端知道它刚刚重新加载了一个页面,因此它很适合决定这是一个重新连接事件。

_chatHub.server.reJoinRooms();

然后 Hub 可以通过 UserId 而不是 ConnectionId 查询用户的房间。

public Task ReJoinRooms()
{
// get the user's rooms from your repository
// optionally get the user's connectionIds from your repository
// Clients.Caller.onJoinRooms(rooms);
// or Clients.Clients(_connectionIds).onJoinRooms(rooms);
}

然后客户端可以决定是否采取行动:

$chatModule.client.onJoinRooms = function (rooms) {
   for (var i in rooms) {
           var _room = rooms[i];
           // if I'm not already in this room, add it to my rooms
           console.log('joining room', _room)
       }
}

您可以采用多种不同的方式制作皮肤。客户端也可以拥有记住房间的范围,而不是服务器端存储库。

编辑 2

如果用户所属的组/房间的数量不断增加,上面的示例可能不会很好地扩展。

在这种情况下,每个用户都可以改为加入个人供稿(即加入以用户的 GUID 命名的供稿)。我们将跟踪隶属于某个组的每个用户。当一条消息发送到该组时,我们将遍历这些用户并向每个提要发布一条消息。

关于c# - SignalR:如何在页面重新加载时停止创建新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20233849/

相关文章:

c# - 为什么我在 SignalR 上收不到以复杂对象作为参数的事件?

javascript - 如何让 SignalR 与 RequireJS 一起工作?

c# - LINQ 有条件地添加联接

c# - 推送到生产服务器时 ASP.NET MVC 错误 500

c# - 在 .Net 中获取实际的 dll 路径

javascript - 在 javascript 中绑定(bind)大量对象可见性。管理当前状态

c# - ASP.NET MVC4 一 View 多模型

c# - 为什么 CUDA 内核中的 z 总是零

asp.net - 如何在网格行中显示枚举描述或名称?

javascript - SignalR 聊天 : Differentiating ListItem sender and receiver for Css