2010-08-28 155 views
2

我确定这个问题已经被问到,但我真的没有看到它。使用ASP.Net跟踪打开的页面

使用asp.net和c#,如何跟踪打开/关闭的页面?

我已经尝试了各种各样的事情,包括:

  • 修改Global.asax文件的应用程序/会话开始/结束操作
  • 设置页面的析构函数报到应用
  • 静变量(持续全局而不是逐个会话)
  • javascript window.onload和window.onbeforeunload事件处理程序

这是教育,但到目前为止还没有真正的解决方案出现。

我想这样做的原因是为了防止多个用户同时修改同一个表。也就是说,我有一个指向表的链接列表,当用户点击修改一个表时,我想设置该链接被锁定,以便没有用户可以修改该表。如果用户关闭表格修改页面,我无法解锁指向该表格的链接。

谢谢您的阅读和帮助。

+0

您听起来像是在试图解决并发问题。也许更好的方法是使用'IsOpened'或'IsLocked'列来锁定SQL表级别? – cofiem 2010-08-29 00:43:50

回答

2

您不应该担心跟踪打开或关闭页面。一旦网页由IIS呈现,它就像“关闭”一样好。

你需要做的是通过使用锁...例如从两个用户同时更新表保护:

using (Mutex m = new Mutex(false, "Global\\TheNameOfTheMutex")) 
    { 
      // If you want to wait for 5 seconds for other page to finish, 
      // you can do m.WaitOne(TimeSpan.FromSeconds(5),false) 

      if (!m.WaitOne(TimeSpan.Zero, false)) 
       Response.Write("Another Page is updating database."); 
      else 
       UpdateDatabase();        

    } 

这是什么上面的代码所做的是,它不会允许任何其他网页来调用UpdateDatabase方法,而另一个页面已经在运行UpdateDatabase调用。所以没有两个页面可以在同一时间调用updatedatabase。

但是这并不能保护第二个用户运行UpdateDatabase在第一次调用完成后,所以你需要确保你的UpdateDatabase方法已经在适当的位置检查了。它不允许陈旧的数据被更新。

+0

+1(虽然锁定表可能不是最好的想法) - 顺便说一句,它是“m.WaitOne”,而不是“m.WatiOne” – dampee 2010-08-30 14:53:52

+0

“它和封闭一样好”是我一直在寻找的答案。我一定会尝试互斥解决方案,尽管 – user420667 2010-08-31 01:13:21

+0

感谢您指出了错字,我将其更正为WaitOne。 – ace 2010-09-01 03:37:10

1

我认为你要对这个错误的方式...

你真的应该通过处理业务层的并发/ db和不依赖接口上,因为人们能够而且将会找到任何你周围的方式实行。

我建议每次您提供可以修改表格的页面时,都会在您的服务页面中存储“密钥”。关键就像上次更新表格时的版本标记。在更新之前将此密钥与更新一起发送并验证它们是否匹配。如果他们不知道,那么你知道有其他人出现并修改了该表,并且应该通知用户存在并发冲突,数据已更改,他们是否希望看到新数据。

1

您不应该使用页面请求来锁定数据库表。由于许多原因,这不会很好。每个请求都会创建一个新的页面对象,并且有多个应用程序上下文,这些应用程序上下文可能位于多个线程/进程上等等。其中任何一个都可能在任何时间点从地球表面掉落。

解决此问题的最高级别是找出为什么您需要首先锁定表格。避免这种情况的一种常见方式是接受所有用户表修改并允许用户解决他们的冲突。

如果锁定是绝对必要的,那么可以使用锁定表,它在更改前后进行修改。如果用户不这样做,那么这张表应该有一种锁定方式。

例如,请参阅http://www.webcheatsheet.com/php/record_locking_in_web_applications.php它适用于PHP,但概念相同。