Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 信号器-保持更新的连接ID_C#_Asp.net Mvc 4_Signalr - Fatal编程技术网

C# 信号器-保持更新的连接ID

C# 信号器-保持更新的连接ID,c#,asp.net-mvc-4,signalr,C#,Asp.net Mvc 4,Signalr,我正在用asp.NETMVC编写一个相当大的web系统,它包括根据用户订阅的内容实时向众多用户发送数据 我和我的团队决定使用SignalR,我负责在系统中实现它 在我们的例子中,用户选择一个组来加入,然后选择一件事情来处理 为此,我将所有用户保存在一个数据库中。我将使用信号器组来处理第一个类别,当我需要为他选择的另一个东西向特定用户推送消息时,我将从DB获取他的ConnectionID 问题是——每次刷新页面时,例如,当用户选择一个组加入时,他就会得到一个新的connectionID。现在他看不

我正在用asp.NETMVC编写一个相当大的web系统,它包括根据用户订阅的内容实时向众多用户发送数据

我和我的团队决定使用SignalR,我负责在系统中实现它

在我们的例子中,用户选择一个组来加入,然后选择一件事情来处理

为此,我将所有用户保存在一个数据库中。我将使用信号器组来处理第一个类别,当我需要为他选择的另一个东西向特定用户推送消息时,我将从DB获取他的ConnectionID

问题是——每次刷新页面时,例如,当用户选择一个组加入时,他就会得到一个新的connectionID。现在他看不到任何推给他的东西


我在SignalR beta中看到了这一点,在版本2中,我正在使用的计算机上只有1.1.1。您可以在beta中制作自己的IUserIdProvider IUserIdPrefixGenerator,或IUSerConnectiondFactory等。因此,我可以给他我想要的,但我在我的SignalR版本中似乎没有这些

有很多方法可以解决这个问题,但最简单的方法之一可能是将新连接id与用户关联,可能他们仍然在不同的选项卡中打开另一个连接。这可以使用IP地址、用户代理、头或位置的任意组合来完成。另一个很好的候选方法是使用会话,或者只是一个简单的标识符cookie,这或多或少是会话所要做的


为此,我经常使用guid,然后在创建新的标识符cookie时在数据库中创建一个表。每次用户刷新或打开新选项卡时,都可以在JS中读取cookie,并使用hub.connect发送cookie。然后,您可以在新连接id和现有标识符cookie之间创建关联。

我强烈建议您找出一种不同的方法来维护用户的持久连接。通常,我将所有用户连接ID存储在并发字典中,以允许线程安全地访问集合。每当发生断开连接事件时,我就从字典中删除用户,每当发生连接事件时,我就添加用户

Signaler将为您管理用户的连接。如果您在数据库中执行此操作,并且与SignalR不同步,则首先会绕过许多使其正常工作的机制

  private readonly static Lazy<App> _instance = new Lazy<App>(
        () => new App(GlobalHost.ConnectionManager.GetHubContext<AppHub>().Clients));

    private readonly ConcurrentDictionary<string, User> _users = new ConcurrentDictionary<string, User>(StringComparer.OrdinalIgnoreCase);

    private IHubConnectionContext Clients { get; set; }

    public App(IHubConnectionContext clients)
    {
        Clients = clients;
    }

我会看一看,它提到了一些建议来实现你所需要的连接与用户不同,用户可以有许多并发连接,如果他有选项卡,但是用户仍然可以接收到他第一次连接的消息吗?谢谢,但是,由于我的中心目前只知道连接ID,不知道哪个用户与他连接,因此我无法将我与该用户的连接关联起来,除非他选择要加入的组。是的,但是你不能在用户第一次访问时编写一个cookie,以便与他们保持联系吗?这一点是为了给你一些东西,通过这些东西你可以识别用户,不管他们有哪个连接ID。重点是,信号器使用连接ID向客户端发送消息。一旦客户端刷新页面,他就有了一个新的连接ID。我已经实现了一个代码,该代码保存了一个带有用户详细信息的cookie,但我无法覆盖默认连接ID提供程序以使他使用原始连接ID。我明白了,因此,如果您已经有一个持久ID,我不会覆盖信号器连接ID。相反,我会将您的集线器消息发送到每个具有该持久ID的连接ID。几乎就像该用户在其所有连接ID上的子组一样。@Akabutz抱歉,我应该澄清一下。用户是一个自定义对象,它包含用户Id所需的任何标识符、标识上下文中的用户名、ect以及连接Id,甚至连接Id列表。如果您在用户的连接上捕获该信息,它将永久保存在内存中