SignalR,如何确保一次只有一个用户可以编辑给定的表单?
SignalR, how to ensure that only one user can edit a given form at a time?
我有一个包含项目列表和有限数量用户的仪表板。我想在所述项目附近显示“正在编辑一个项目”,以避免同时编辑和覆盖数据。
在我看来,这就像更新数据库中的标志和使用 javascript 简单地 adding/removing a css class.
的相对简单的信号器实现
我看过这个:
Prevent multiple people from editing the same form
它描述了一种方法,当没有来自用户的更多更新消息时,每 X 分钟发布一次并从数据库中清除标志。
问题是:
我想知道是否有信号器方法(如断开连接;我知道它存在但我不知道它是否适合这种情况)来优雅地执行此操作而不是 运行 计时器函数。如果是这样,服务器是否有可能错过事件并永久保留标记为“正在编辑”?
您可以为此实现一个集线器,这是一个示例:
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 方法会在客户端断开连接时调用,因此您可以使用此方法进行清理。
在此集线器中,您还可以实现更新功能
希望这就是您要找的
我有一个包含项目列表和有限数量用户的仪表板。我想在所述项目附近显示“正在编辑一个项目”,以避免同时编辑和覆盖数据。 在我看来,这就像更新数据库中的标志和使用 javascript 简单地 adding/removing a css class.
的相对简单的信号器实现我看过这个: Prevent multiple people from editing the same form 它描述了一种方法,当没有来自用户的更多更新消息时,每 X 分钟发布一次并从数据库中清除标志。
问题是: 我想知道是否有信号器方法(如断开连接;我知道它存在但我不知道它是否适合这种情况)来优雅地执行此操作而不是 运行 计时器函数。如果是这样,服务器是否有可能错过事件并永久保留标记为“正在编辑”?
您可以为此实现一个集线器,这是一个示例:
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 方法会在客户端断开连接时调用,因此您可以使用此方法进行清理。
在此集线器中,您还可以实现更新功能
希望这就是您要找的