gpt4 book ai didi

asp.net-mvc-3 - C# lock 关键字,我想我用错了

转载 作者:行者123 更新时间:2023-12-05 00:04:49 29 4
gpt4 key购买 nike

我最近在 ASP.NET MVC 中遇到了多个表单发布的问题。应用。情况基本上是,如果有人故意敲击提交按钮,他们可以强制多次发布数据,尽管旨在禁止这种情况的验证逻辑(服务器端和客户端)。发生这种情况是因为他们的帖子会在 Transaction.Commit() 之前通过。方法可以在初始请求上运行(这都是在 nHibernate 中完成的)

MVC ActionMethod 看起来有点像这样..

public ActionResult Create(ViewModelObject model)
{
if(ModelState.IsValid)
{
// ...

var member = membershipRepository.GetMember(User.Identity.Name);
// do stuff with member
// update member
}
}

提出了很多解决方案,但我找到了 C# lock声明,并尝试了一下,所以我将代码更改为如下所示...
public ActionResult Create(ViewModelObject model)
{
if(ModelState.IsValid)
{
// ...
var member = membershipRepository.GetMember(User.Identity.Name);
lock(member) {
// do stuff with member
// update member
}
}
}

有效!我的测试人员都无法重现该错误了!我们已经敲定了一天多,没有人能找到任何缺陷。但我对这个关键字并不是很熟悉。我又查了一下,想澄清一下……

The lock keyword marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object, executing a statement, and then releasing the lock



好吧,这是有道理的。这是我的问题。

这太容易了

这个解决方案看起来简单、直接、清晰、高效和干净。它是 方式太简单。我知道最好不要认为复杂的事情有那么简单的解决方案。所以想请教有经验的程序员...

有什么不好的事情我应该注意吗?

最佳答案

不,没那么容易。锁定仅在相同的情况下有效 实例用来。

这将不起作用:

public IActionResult Submit(MyModel model)
{
lock (model)
{
//will not block since each post generates it's own instance
}
}

您的例子 可以 工作。这完全取决于是否在 nhibernate 中启用了二级缓存(从而返回相同的用户实例)。请注意,它不会阻止任何内容发布到数据库,只是每个帖子将按顺序保存。

更新

另一种解决方案是添加 return false;当它被按下时提交按钮。它会阻止按钮多次提交表单。

这是一个 jquery 脚本,它将为您解决问题(它将遍历所有提交按钮并确保它们只提交一次)
$(document).ready(function(){
$(':submit').click(function() {
var $this = $(this);
if ($this.hasClass('clicked')) {
alert('You have already clicked on submit, please be patient..');
return false;
}
$this.addClass('clicked');
});
});

将它添加到您的布局或 javascript 文件中。

更新2

请注意,jquery 代码在大多数情况下都有效,但请记住,任何具有一点编程知识的用户都可以使用例如 HttpWebRequest向您的 Web 服务器发送垃圾邮件。这不太可能,但可能会发生。我要说明的一点是,您不应该依赖客户端代码来处理问题,因为它们可以被规避。

关于asp.net-mvc-3 - C# lock 关键字,我想我用错了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273546/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com