2010-10-21 57 views
0

我最近的任務是修復由於會話狀態被濫用而導致的相當惡劣的錯誤。我們有一個使用inproc會話狀態在單臺服務器上運行的asp.net Web應用程序。基本設計是從數據庫中加載類型化數據集,並使用常見會話變量名稱(如Session [「dataset」] = dataset)存儲在會話狀態中。數據存儲在會話中後,用戶將編輯數據,從會話中檢索數據集並更新併發送到數據庫進行更新。這種類型的數據編輯\存儲用於基本上執行相同操作的多個Web表單。直到用戶嘗試啓動應用程序的第二個實例並且會話變量中存儲的數據可能混淆爲止,這一切都是好事。如何最好地解決InProc會話狀態變量多實例問題?

這裏是我已經能夠找到

  1. 設置的sessionState無Cookie =「假」(每一個新實例都有一個唯一的會話ID) 專業人士那裏獲得可能的解決方法 - 最簡單的方法,幾乎​​沒有任何代碼改變需要 缺點 - 在URL全局唯一標識符,用戶可以編輯GUID,GUID可以複製

  2. 使用自定義會話密鑰對每個實例(大約傳遞一個會話密鑰,並結合它的「數據集」 +會話密鑰的名稱,以便每個實例都有一個唯一的會話變量) PROS - 沒有一個GUID URL 缺點 - 大部分的代碼量的變化,可能是脆弱的

  3. 刪除會話變量(負載從數據庫中的數據集進行編輯第二次) PROS-釋放了服務器資源,不再依賴會話狀態 缺點 - 性能命中,代碼的高量變化

任何人都知道任何其他可能的解決方案?謝謝

回答

0

那麼,保證兩個實例不會訪問同一個sessionstate的唯一方法就是使用url/POST-data做一些事情。這就是你必須玩的。

最簡單的可能是使用cookieless = true,並希望所有url:s被正確地重寫。最好的辦法可能就是直接訪問數據庫,很可能不會像你想象的那樣影響數據庫,如果它影響到,你不應該爲每個用戶緩存大量數據,而應該使用全局緩存。

+0

我同意,緩存每個用戶的數據是不好的。這就是我試圖解決它的原因。當你說使用「全局緩存」時,我不確定你的意思。我已經爲應用程序範圍的數據使用了應用程序緩存,但是如何爲每個用戶加載的數據工作? – NullReference 2010-10-21 21:44:02

+0

全球是相對的,每個應用程序是我的想法:)如果你真的,真的必須有每個用戶的數據,你可以用一個連接到用戶的密鑰保存數據。但是,除非你真的有性能問題,否則我不推薦緩存。 – Onkelborg 2010-10-21 21:47:05

0

您聲明第三個選項是性能命中(完全刪除會話對象),但是您嘗試過嗎?

我問,因爲序列化標準數據集is notoriously resource intensive on the server side - 在許多情況下(1MB數據集可能需要10-15MB的序列化)以及處理器執行此操作的時間,內存佔用會增加一個數量級。

我真的建議看着嘗試3和測試,看看您的問題有充分的理由,或者如果你真的看到一個性能增益;)

如果您在會話存儲數據集的設置,那麼你應該查看custom serialisation以最大限度地減少存儲的數據量。

+1

我沒有嘗試刪除會話對象並重新加載數據,我會試試看。 – NullReference 2010-10-21 21:33:09

+0

正如一個側面說明,它看起來像使用會話[「數據集」] = dataset.GetXml()會話中存儲數據集。不知道這是否與直接序列化不同。 – NullReference 2010-10-21 21:39:18

+0

在proc會話狀態不會序列化,但似乎Seralization被迫..雖然.. – Onkelborg 2010-10-21 21:47:55