我最近在一个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
}
}
}
它有效了!我的测试人员中没有人能再复现这个错误了!我们已经花费一整天的时间攻破它了,没有人能找到任何漏洞。但我对这个关键字并不是很了解。我又查了一遍以获得澄清......
锁定关键字(lock keyword)将一个语句块标记为给定对象的临界区,通过获取互斥锁执行一个语句,然后释放锁。
好的,这很有道理。这是我的问题。
这太容易了。这个解决方案看起来简单、直接、清晰、高效而干净。 这太简单了。我知道比起这么简单的解决方法,事情肯定更加复杂。所以我想向更有经验的程序员提问......
我应该注意到什么不好的事吗?
lock(someObject)
吗? - Cosmin