繁体   English   中英

SignalR-保持更新的ConnectionID

[英]SignalR - keeping updated ConnectionID

我正在用asp.net MVC编写一个相当大的Web系统,该系统涉及根据订阅的内容实时向众多用户发送数据。

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

在我们的例子中,用户选择一个要加入的组,然后选择1个要处理的事物。

为此,我将所有用户保存在数据库中。 我将使用SignalR组来处理第一类,并且当我需要向特定用户发送消息时(他会选择其他方法),我只会从数据库中获取他的ConnectionID。

这就是问题所在-每次刷新页面时(例如,当用户选择要加入的组时),他都会获得一个新的connectionID。 现在,他看不到任何被推到他身上的东西。

我在SignalR beta和版本2(我正在使用的计算机上只有1.1.1)中看到,可以创建自己的IUserIdProvider(beta中的IUserIdPrefixGenerator)或IUserConnectionIdFactory等。因此,我可以给他我希望他拥有它,但是我的SignalR版本中似乎没有这些。

解决此问题的方法有很多种,但是最简单的方法之一可能是将新的连接ID与用户相关联(也许他们还在另一个选项卡中打开了另一个连接)。 可以使用IP地址,用户代理,标头或位置的任意组合来完成此操作。 另一个不错的选择是使用会话,或者仅使用一个简单的标识符cookie(无论如何会话都差不多)。

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

我强烈建议您找出其他方法来维护用户的持久连接。 通常,我将所有用户连接ID都存储在并发字典中,以允许对集合进行线程安全访问。 每当发生断开连接事件时,我都会从字典中删除用户,并且每当发生连接事件时都将它们添加。

SignalR将为您管理用户的连接。 您需要在数据库中执行此操作并使其与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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM