2010-02-05 60 views
1

我們是否「做錯了」?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經驗來確定我們應該做什麼?有沒有更好的方法來做到這一點,或者它確實好嗎?

+0

從閱讀中,我認爲我們應該鎖定Hashtable的同步根,因爲它不安全......我想。 – 2010-02-06 00:53:06

回答

2

由於您的所有用戶似乎都已通過身份驗證,因此我建議您考慮使用管理會話狀態和超時的其他方式。你有問題的

部分原因是,如果用戶剛剛關閉,不退出瀏覽器,或使用應用程序停止,你必須等待,直到會話超時殺死它關閉並釋放UniObjects您的許可問題。

我的建議如下:

  1. 添加一個不可見的IFRAME您 母版的模板,或者每一頁 的網站,如果你不使用 MasterPages。
  2. 該MasterPage將 加載一個KeepAlive.aspx頁面,即 包含一個META Refresh,每5分鐘重新加載 該頁面。
  3. 可以 會話超時減少到10 分鐘(甚至6)

現在,如果用戶關閉瀏覽器窗口,他們的會話時間比平時出更快,但如果他們的瀏覽器窗口保持開放,他們的會議持續不斷。

A碼例如與漫遊可以看出here

您現在需要的解決方案,以防止用戶離開他們的瀏覽器窗口中打開了一夜,佔用你的UniData許可證。在這種情況下,我會實施一種類似的方法,即將停滯的頁面(即用戶20分鐘內沒有做任何事)刷新到註銷ASPX頁面,清除會話。

+0

感謝您保留文章的鏈接,這是有道理的。 – 2010-02-06 00:58:12

2

當你說你正在使用UniObjects ...你使用的是COM還是.NET對象集?最簡單的方法就是使用UniObject Conneciton池。

當你創建你單身,你將其存儲在應用程序對象,會話對象,或緩存對象?

我會建議應用程序對象,因爲Session對象可以做奇怪的事情。處理和檢查超時的一種方法是使用具有CacheRemoveCallback的緩存鍵。通過這種方式,您可以使用文件/路徑監視器依賴關係來監視Windows文件更改,以便手動執行刪除操作或緩存依賴項中的超時。

退到這是對緩存依賴超時只能通過網頁活動驅動,如果asp.net會話回收,則可能/將destory緩存依賴。

森校長

+0

嗨Nathan,它存儲在一個靜態Hashtable中,所以它在App域中。我們現在正在使用COM庫,因爲我們正在使用COM庫的傳統開發環境中進行測試。至於連接池,我們在用戶許可證中已經有了過量,所以我們不能證明連接池的成本是合理的。 – 2010-02-06 00:51:58

2

如果使用UniObjects COM,確保你得到你的COM編組正常工作。看一看:

SafeCOMWrapper - 管理一次性強類型安全的封裝到後期綁定COM http://www.codeproject.com/KB/COM/safecomwrapper.aspx

另一件要注意的是,在UniObjects COM動態數組類有一個線程問題是不和.NET玩好。如果可以,請在.NET中使用自己的動態數組類或數組拆分,而不要在UniObjects COM中使用動態數組類。

有時,當你試圖從類訪問數據,它顯示一個空字符串,但是當你調試它的數據是存在的。不知道這個的根本原因。

如果您需要一個與.NET一起工作的通用動態數組類,我可以提供給您。

UniObjects.NET沒有這些問題,據我所知。

Nathan Rector