C# 信号器:如何在页面重新加载时停止创建新连接

C# 信号器:如何在页面重新加载时停止创建新连接,c#,asp.net-mvc-4,signalr,signalr-hub,C#,Asp.net Mvc 4,Signalr,Signalr Hub,您好,我正在开发一个聊天应用程序以及我的应用程序中的一些其他页面。登录后,我将维护用户的会话。我的主要意图是,当其他用户连接到服务器时,用户应该得到通知 我面临的问题是,每当我在应用程序中导航到其他页面时,连接就会丢失。如何停止此行为并继续连接,直到用户注销 我在ASP.NET MVC4项目中使用SignalR 2.0,任何帮助???每个连接在用户在给定页面上花费的时间内都有一个生命周期。当他们导航到另一个页面时,会建立一个新的连接。此外,如果用户打开了多个选项卡或浏览器窗口,则他们将具有多个连

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

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


我在ASP.NET MVC4项目中使用SignalR 2.0,任何帮助???

每个连接在用户在给定页面上花费的时间内都有一个生命周期。当他们导航到另一个页面时,会建立一个新的连接。此外,如果用户打开了多个选项卡或浏览器窗口,则他们将具有多个连接ID。我认为您不希望尝试将连接Id持久化到预期的生命周期之外

在我处理的类似场景中,我们将ConnectionID存储在Connect上,并在Disconnect上删除它们。当一条消息需要发送给一个给定的用户时,我们会将它发送给他们的所有连接ID。这确保消息将传递到所有选项卡/窗口

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

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

客户机知道它刚刚重新加载了一个页面,因此它很适合判断这是一个重新连接事件

_chatHub.server.reJoinRooms();
然后,中心可以通过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命名的提要)。我们将跟踪每个隶属于某个组的用户。当一条消息被发送到该组时,我们将迭代这些用户的,并向每个提要发布一条消息。

您应该将用户的状态保存在数据库或其他地方。并且应该在用户注销时通知其他用户,而不是在信号器关闭连接时通知信号器在每次重新加载页面时关闭连接,如何停止此行为@Patelwhat is perfect是基于需求@Patel的主观判断,从我的需求角度来看,这很奇怪。我同意,我现在也在遵循同样的策略,但问题是我正在显示连接到服务器的用户,因此当用户导航到其他页面时,他不再显示在网上。我想让连接持久,只要他使用的是应用程序,而不是基于页面@安第萨,对。您可以在会话期间保留用户的状态,而不是将状态作为其connectionId的函数。此外,对于转换,如重新加入房间,您可以包含一个bool参数,以指示用户正在“重新连接”,在这种情况下,您可以吞下为此类事件而推送的正常消息。如何识别连接id为GUID的同一用户正在重新连接,您可以为其提供一些代码片段吗。在安第斯山脉,这将是有益的