【问题标题】:Lock web service method for one client锁定一个客户端的 Web 服务方法
【发布时间】:2018-06-06 08:40:25
【问题描述】:

这是我的场景:我正在开发一个用户可以“喜欢”产品的电子商务系统 (ASP.NET MVC)。我的网络服务 (.svc) 中有一个方法,如果用户已经喜欢该产品,它会删除喜欢的产品,如果用户没有,它会为产品添加一个喜欢的产品。

我这里有个问题:我通过Ajax异步调用'Like'方法,如果用户连续多次点击like按钮,那么,该方法被连续调用多次。由于此方法不是线程安全的,因此我可能在这里遇到问题。 (例如,它可能会为数据库中的一个用户多次插入like)

我一直试图通过使用lock 语句使其成为线程安全的,但显然它仍然不起作用。 这是我的网络服务方法:

    private static Object productLikeLock = new Object();
    [WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public bool ToggleProductLike(int productId)
    {
        try
        {
            if (User.Identity.IsAuthenticated)
            {
                lock (productLikeLock)
                {

                    if (/* User has already liked the product */)
                    {
                        // Remove it from the database
                        return true;
                    }
                    else
                    {
                        // Add it to the database
                        return true;
                    }
                }
            }
            return false;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

谁能帮助我,让我知道我的代码和方法有什么问题? 提前致谢

【问题讨论】:

  • 只是一个问题,如果您使用的是 MVC,为什么还要使用古老的 asmx 样式的 Web 服务而不是使用 Web API,这是现代推荐的方式并且通常更易于使用?这与您的问题无关,只是一个奇怪的设计决定。
  • @ADyson 我使用 WCF,这是一个写作错误

标签: c# asp.net ajax asp.net-mvc thread-safety


【解决方案1】:

您真正想要的是锁只对用户有效,而不是对整个应用程序有效。私有静态不适合这里的锁。您可能会使用Dictionary<UserId, LockObject> 锁定,但这仍然不是很好。

我建议不要尝试将此功能实现为切换。切换状态总是会让你陷入这种麻烦。

尝试重新设计应用程序,使其具有显式的LikeDislike 操作。这样您就不必锁定任何东西。

【讨论】:

  • 没错。但是我认为即使我将“切换”方法分成两个单独的方法,我仍然会遇到这个问题。因为当客户端向 'Like' 方法发送多个请求时,我们会再次遇到这个故事。
  • like 方法对于重复调用应该是幂等的,它将对该产品和该用户的值设置为“喜欢”。确保此状态仅在您的数据模型中表示一次,不要单独记录每个 like 调用。
  • 您能否提供一个非常简单的示例,说明如何根据您所说的创建数据库模型(存储“喜欢”状态而不是在每一行中存储用户喜欢)。因为我连脑子里都想不出来。这对我来说非常重要。非常感谢提前
  • 有一个代表链接的Likes 表/对象,它包含用户和产品的外键,没有其他内容(可能是PK)。创建链接行(喜欢)或删除喜欢的行(不喜欢)。然后这些操作很容易重复。
  • 这正是我所做的,但这样我们又遇到了这个问题。 :)
猜你喜欢
  • 2014-09-04
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2013-02-03
  • 2010-11-09
  • 2010-09-17
  • 2020-10-23
  • 1970-01-01
相关资源
最近更新 更多