【问题标题】:SignalR, how to ensure that only one user can edit a given form at a time?SignalR,如何确保一次只有一个用户可以编辑给定的表单?
【发布时间】:2021-04-18 23:41:24
【问题描述】:

我有一个仪表板,其中包含项目列表和有限数量的用户。我想在所述项目附近显示“正在编辑项目”以避免同时编辑和覆盖数据。 在我看来,这就像更新数据库中的标志和使用 javascript 简单地添加/删除 css 类的相对简单的信号器实现。

我看过这个: Prevent multiple people from editing the same form 它描述了一种在用户不再有更新消息时每 X 分钟发布一次并从数据库中清除标志的方法。

问题是: 我想知道是否有一个信号器方法(比如断开连接;我知道它存在,但我不知道它是否适合这种情况)来优雅地做到这一点,而不是运行一个计时器函数。如果是这样,服务器是否有可能错过该事件并在没有时将其永久标记为“正在编辑”?

【问题讨论】:

    标签: asp.net-core .net-core signalr


    【解决方案1】:

    您可以为此实现一个集线器,这是一个示例:

    public class ItemAccessHub : Hub
    {
        public override Task OnConnectedAsync()
        {
            // your logic to lock the object, set a state in the db
    
            return base.OnConnectedAsync();
        }
    
        public override Task OnDisconnectedAsync(Exception exception)
        {
            // your logic to unlock the object
    
            return base.OnDisconnectedAsync(exception);
        }
    }
    

    要从查询中获取信息,您可以访问 HttpContext:

    Context.GetHttpContext().Request.Query.TryGetValue("item-id", out var itemId)
    

    这样您就可以在用户访问表单时启动连接并在查询中发送项目的 ID:

    /hub/itemAccess?item-id=ITEM_ID
    

    当用户关闭表单时,断开连接。 使用此方法,当用户失去网络连接时,该项目也会解锁。

    on disconnect 方法是在客户端断开连接时调用的,因此您可以在此方法中进行清理。

    在这个集线器中,您还可以实现更新功能

    我希望这就是你要找的东西

    【讨论】:

    • 这是否意味着即使在“强制情况”(如客户端计算机崩溃或进程意外终止或停电)中也始终调用断开连接方法?
    • 只有当你的服务器崩溃时它才会被调用。在文档中它说:“如果客户端应用程序或它正在运行的计算机在这些情况下崩溃或进入睡眠状态[...],则服务器等待给客户端一个重新连接的机会,并且 OnDisconnected 直到断开超时期限到期(默认约 30 秒)。” Source
    猜你喜欢
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2011-05-09
    相关资源
    最近更新 更多