2009-11-06 80 views
3

保存我們有一個複雜的頁面,有各種各樣的事情在進行各種相關的會話變量。目前這些會話值是單獨的頁面屬性(Guid,String,Integer等)。如果我有一個具有這些屬性的可序列化對象並將它保存在會話中,它會更有效嗎?asp.net:單獨的會話變量VS對象在會話

回答

5

這是不太可能是一個問題,但你可能會考慮在ViewState中存儲網頁的特定值來替代。

我創建了一個名爲SessionInfo靜態類包裝訪問會話變量,例如:

public static class SessionInfo 
{ 
    private const string AUDITOR_ID_KEY = "AUDITOR_ID_KEY"; 

    private static T GetSessionObject<T>(string key) 
    { 
     object obj = HttpContext.Current.Session[key]; 
     if (obj == null) 
     { 
      return default(T); 
     } 
     return (T)obj; 
    } 

    private static void SetSessionObject<T>(string key, T value) 
    { 
     if (Equals(value, default(T))) 
     { 
      HttpContext.Current.Session.Remove(key); 
     } 
     else 
     { 
      HttpContext.Current.Session[key] = value; 
     } 
    } 

    public static int AuditorId 
    { 
     get { return GetSessionObject<int>(AUDITOR_ID_KEY); } 
     set { SetSessionObject<int>(AUDITOR_ID_KEY, value); } 
    } 
} 
+0

Re:Viewstate,這些值存儲在會話中,因爲用戶需要導航離開並返回到頁面,例如添加各種新項目或僅在網站周圍導航時。會話變量存儲會話持續存在的各種類別和過濾器選擇。在這種情況下,會話比Cookie更安全穩定。 – 2009-11-06 13:54:51

+0

@Mark - 這聽起來像Session是更好的選擇。我只想指出,ViewState已加密並存儲在隱藏的表單字段中,並未存儲在Cookie中。 – 2009-11-06 14:05:30

+0

@Jamie - 感謝分享這個解決方案,我進一步走下了這條路線,因此接受答案的變化。 – 2009-11-08 22:24:27

3

只要類是小而緊湊,沒有太多的功能沒問題。如果您不需要更頻繁地創建值,就可以爲此創建不可變的結構。任何修改後,您都可以使用新結構覆蓋。

這是一些代碼。

public struct MyStruct 
    { 
     public string MyProp; 
     public MyStruct(string myProp) 
     { 
      this.MyProp = myProp; 
     } 
    } 

    public MyStruct MyStructInSession 
    { 
     get 
     { 
      if (Session["_MyStructInSession"] == null) 
      { 
       Session["_MyStructInSession"] = new MyStruct("unnamed"); 
       //or you can throw an exception but that's not adviseble. 
       //throw new Exception("Nothing stored in session"); 
      } 
      return (MyStruct)Session["_MyStructInSession"]; 
     } 
     set 
     { 
      Session["_MyStructInSession"] = value; 
     } 
    } 
+0

值將需要單獨更新。是的,這將是一個公共獲得者和制定者的簡單對象。 – 2009-11-06 13:11:17

+0

我建議創建一個不可變的結構類型並將其存儲在會話中。這是更好的方法。過去我已經完成了這個工作,對我來說這個工作非常可靠。我的結構類型有大約8個道具。 – 2009-11-06 13:18:28

+0

@Curious,你能展示一些你做過的示例代碼嗎? – 2009-11-06 13:20:16

3

如果性能是一個主要問題,那麼您可能需要考慮優化會話內容的序列化。當您擴展到會話服務器或使用SQL Server管理會話狀態時,序列化/反序列化成爲更大的瓶頸。

MSDN Magazine

會話狀態使用自定義 序列化機制轉換的 會話詞典和其內容 二進制BLOB存儲過程外的一個存儲中的數據 之前。該 序列化機制具有.NET框架基本 類型,包括字符串,布爾值,日期時間 ,時間跨度,Int16的,的Int32, Int64的,字節,字符,單人,雙人, 小數,爲SByte,UINT16,UInt32的直接 支持, UInt64,Guid和IntPtr。 直接寫入團塊這些類型的,而 對象類型被序列與 的BinaryFormatter,這比較慢。 反序列化遵循相同的 規則。通過優化會話 內容,可以顯著降低 序列化的開銷和反序列化 狀態數據。

在設計會話對象 模型時,避免在 會話中存儲對象類型。相反,只會根據會話數據在會話 字典中存儲 基本類型並在每個請求 中重建您的業務 層會話對象。這避免了使用BinaryFormatter的開銷。

與往常一樣,做任何優化前先測量你的表現。

+0

嗨,它只是通常的預防性關注事項儘可能精簡和可讀/可更新。 – 2009-11-06 13:35:22

+0

然後我會去結構。但是,如果您的會話序列化開始成爲瓶頸,那麼您總是可以將結構分開。 – 2009-11-06 13:43:04