c# - 锁定一个客户端的 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;
}
}
谁能帮助我,让我知道我的代码和方法有什么问题?提前致谢
解决方案
你真正想要的是锁只对用户有效,而不是对整个应用程序有效。私有静态不适合这里的锁。您可能会使用 aDictionary<UserId, LockObject>
作为锁,但这仍然不是很好。
我建议不要尝试将此功能实现为切换。切换状态总是会让你陷入这种麻烦。
尝试重新设计应用程序以具有显式Like
和Dislike
操作。这样你就不必锁定任何东西。
推荐阅读
- javascript - 显示为未定义的数字的阶乘
- pyspark - Happybase 与 hbase 连接时出错,我如何定义我的主机
- c# - Webbrowser 导航到 PDF 文件不显示任何内容
- c# - 将类转换为 XML
- java - 带有多部分/表单数据 Java 代码的 POST 请求
- docker - 如何在 docker 中运行 tensorflow 项目?
- python-3.x - cv2.VideoWriter 不工作(Windows 10)
- php - Apache / WSGI 和 PHP 突然无法连接到 MSSQL 服务器——站点宕机
- dapper - 使用 Split-on 和 Query Multiple 在 dapper 中映射多个对象
- swift3 - 在 userdefaults 中存储服务器响应时....我收到错误