2011-07-04 85 views
0

我有ASP.NET網站使用「inproc」作爲單個服務器中的會話管理。現在,我需要將Web站點放到Web場中的兩臺服務器(位於負載平衡環境之後)。我們瞭解到,「inproc」模式在Web場環境中不再適用。所以,我正在考慮從「inproc」切換到SQL Server模式的選項。另外,我瞭解到,這不僅僅是更新web.config(當然,創建SQL數據庫)的問題。因爲我將數據表,用戶定義的類List,...保存到會話變量中。我明白我必須將用戶定義的類設置爲可序列化的類(只需在類中放置[Serializable]),而.NET將處理其餘的內容(我不必明確地放置代碼來處理此問題)。序列化爲asp.net會話狀態

這是正確的嗎?而且,其他「特殊」類型如DataTable,List如何使它們可分割?

謝謝。

+0

無論如何,所有會話數據都必須可序列化,無論是inproc還是sessionstate或其他任何模式。 –

回答

0

爲了加強@AD.Net的評論,如果您能夠使用inProc模式存儲對象,那麼使用其他模式存儲序列化應該沒有問題。

對於像datatable這樣的對象,你會發現這些類已經被標記爲序列化了。

1

這基本上是正確的,儘管做類,測試所有東西背後的工作不是微不足道的。在會話中需要存儲的所有內容都需要序列化,因此對於「特殊」數據類型,您需要生成它們的序列化版本。您可能想了解爲什麼要將數據表保存到會話狀態中?我建議你有一個很好的看看你在做什麼,並保存在那裏最小的數量 - 鍵不是整個對象。

我目前的客戶端正在使用一個SQL會話與很多大對象,並且運行緩慢,因爲需要對這些大對象進行序列化和反序列化,以及寫入和讀取數據庫。

你可能在某種程度上意識到爲什麼人們說會話變量是一個壞主意。可擴展性是一個大問題,無論是你現在需要做的工作量和sql會話存儲的大小問題。

ETA:正如其他人所說的,對於任何類型的會話狀態,可串行化問題都是相同的。

+0

+1對序列化整個對象的建議 - 我懶得把它添加到我的答案。 @tony - 這個建議可以很好地爲你考慮[你在這裏的其他問題之一](http://stackoverflow.com/questions/6540954/dealing-with-larger-traffic-on-asp-net-web-site ) – Smudge202

+0

我在會話中存儲DataTable的唯一原因是在回發時檢索它,這樣我就不必再次運行qurey來獲取它。我不確定是否有另一種方式可以在不保存會話的情況下檢索它。 – Tony

+0

如果您必須這樣做,請執行此操作,但請記住,這樣做效率非常低,您可能會發現重新執行查詢會更快。或者將數據保存在臨時表中並檢索它。 –

1

我也不得不從InProc方式切換應用程序SqlSessionState

  • DataTable,它已經是序列化1
  • 對於List<T>,它是可序列化的,當且僅當T是可序列化的。

大多數.NET簡單類型都是可串行化的。但是,如果您聲明並使用自己的類,則必須聲明它們是可序列化的,以便將它們存儲在會話中。

tl; dr;將你的Sessionstate切換到SqlServer並序列化,直到它工作。

第二個測試是確保您的兩臺服務器具有相同的加密和解密上下文。請閱讀http://msdn.microsoft.com/en-us/library/w8h3skw9%28v=vs.71%29.aspx並確保兩臺服務器使用相同的密鑰。

+1

加密提示+1。我總是忘記同步MachineKeys – Smudge202