c# - 一次只允许一名用户访问操作

标签 c# asp.net-core identityserver4 asp.net-core-webapi

我有与 Web api 通信的 ASP.NET Core 应用程序。 有一个业务操作涉及几个步骤(在一页上执行某项操作,然后转到下一页和下一页)。这一多步骤操作是在一个元素的上下文中完成的。

假设您有一个一些业务对象的列表,您的任务是从该列表中接受对象3。接受是我们的多步操作,如果我当前接受对象 3,其他人就不能进入对象 3 的接受操作。当我完成操作后,它应该被解锁。 希望这个问题是可以理解的。

我们不想要非常耗时的解决方案,最简单的想法是创建一个数据库表,该表指示用户何时开始操作,它保存对象的 id 和用户的 id,并在例如 5 分钟后自动删除自身,如果其他人想要访问操作,我们检查该对象是否被阻止。但它有点老套而且不太干净(如果用户去喝杯咖啡并在 10 分钟后继续操作怎么办?)

我正在寻找更好的方法来实现这种行为并欣赏任何想法

最佳答案

如果我要实现这种行为,我也会使用数据库,但方式有点不同。我将创建一个对象表(对象 3 是其行之一),为 UserId 添加一列, bool 值 OnProcess (标记对象是否在进程中)和 StartProcess 的时间戳。

为了让用户能够输入操作,请运行如下查询:

UPDATE Objects SET UserId = <CurrentUser>, StartProcess = <NOW>, OnProcess = true
OUTPUT Object.Id
WHERE Object.Id == 3 AND 
    (
        OnProcess == false
        OR ( OnProcess == true AND UserId == <CurrentUser> )
        OR ( StartProcess <is more than 15 minutes ago>)
    )

免责声明:上面的查询不是可执行查询,但它应该足以清楚地理解它的作用。

通过上面的查询,Object.Id 将在以下情况下返回:

  • 该对象未被其他用户处理
  • 该对象正在由 CurrentUser 本身进行处理,同时还会重置 StartProcess(某种滑动行为)。这样,如果 CurrentUser AFK 给定时间(但不超过阈值时间)并回来,他/她可以轻松地继续操作
  • 过去 15 分钟内未处理该对象。这其实就是我前面提到的阈值。至于多长时间(我的例子是15分钟),这完全取决于你。

如果为用户返回了Object.Id,那么他/她就可以进入操作。

关于c# - 一次只允许一名用户访问操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56954874/

相关文章:

c# - smo.application.enumAvailableSqlServers 未返回可用的 SQL Server

asp.net-web-api - 直接从Web API核心端点返回base64编码的图像

c# - 在 Asp.Net Core 上为 MongoDB ObjectId 创建一个 ModelBinder

c# - 在 ASP.NET Core 中解析 Razor 字符串

c# - 在提供 ISigningCredentialStore 的自定义实现后,Identity Server 仍将内存中的 key 包含在发现文档中

c# - 什么是 ProfileService/ProfileService 何时执行?

c# - 如何使用 C# 代码授予用户启动和停止特定服务的权限

c# - 在 .NET DrawingContext DrawText 方法中计算文本换行

c# - SSLStream 相互认证

asp.net-core - 配置 blazor wasm 和单独的 Identityserver4