2010-08-28 131 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,但概念相同。