您好,我正在开发一个聊天应用程序以及我的应用程序中的其他一些页面。一旦我登录,我就会维护用户的 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/