首页 > 解决方案 > 锁定一个客户端的 Web 服务方法

问题描述

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

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

我一直试图通过 using 语句使其成为线程安全的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;
        }
    }

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

标签: c#asp.netajaxasp.net-mvcthread-safety

解决方案


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

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

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


推荐阅读