我們是否「做錯了」?ASP.NET處理外部服務器會話 - 清理
一位同事和我正在搞亂一個ASP.NET頁面,充當「門戶」來查看UniData服務器上診斷程序的結果。雖然我們在工作中做了ASP/ASP.NET的奇怪工作,但它不是我們的主要語言。
要訪問此服務器,我們必須使用UniObjects,這是一個用於認證和使用UniData服務器的API。
我們需要每個訪問該網站的用戶都必須通過UniData進行身份驗證,並通過UniObjects庫獲取他們自己的會話,然後才能夠在無需再次登錄的情況下使用它(除非會話未用於'x'分鐘)。
我們已經想出的方法如下:
我們有一個Hashtable是獨生子。它將Windows用戶名與會話對象進行映射。
如果用戶轉到我們的頁面並且Hashtable中不存在'username',它將重定向到會話對象創建的登錄頁面,並且如果驗證成功,則會將其添加到Hashtable。否則,它會從Hashtable中抓取用戶現有的會話對象,並將其用於請求(除非它已過期,在這種情況下,我們將其刪除並重定向到登錄頁面)。
每個會話對象(這是來自UniObject的東西的包裝對象)都有一個「lastUsed」方法。我們需要清理用戶的會話,因爲我們對登錄到UniData服務器的用戶有許可限制,所以每次用戶被重定向到登錄頁面時,它都會檢查是否有任何會話在'x'分鐘內未被使用,在這種情況下,它會關閉該會話並將其從Hashtable中移除。這是在這裏完成的,所以用戶不會遇到任何與檢查每個請求上的所有會話有關的延遲,只有在登錄時。
有人告訴我這個解決方案有異味,但是我沒有足夠的ASP.NET經驗來確定我們應該做什麼?有沒有更好的方法來做到這一點,或者它確實好嗎?
從閱讀中,我認爲我們應該鎖定Hashtable的同步根,因爲它不安全......我想。 – 2010-02-06 00:53:06