保存我們有一個複雜的頁面,有各種各樣的事情在進行各種相關的會話變量。目前這些會話值是單獨的頁面屬性(Guid,String,Integer等)。如果我有一個具有這些屬性的可序列化對象並將它保存在會話中,它會更有效嗎?asp.net:單獨的會話變量VS對象在會話
回答
這是不太可能是一個問題,但你可能會考慮在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); }
}
}
只要類是小而緊湊,沒有太多的功能沒問題。如果您不需要更頻繁地創建值,就可以爲此創建不可變的結構。任何修改後,您都可以使用新結構覆蓋。
這是一些代碼。
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;
}
}
值將需要單獨更新。是的,這將是一個公共獲得者和制定者的簡單對象。 – 2009-11-06 13:11:17
我建議創建一個不可變的結構類型並將其存儲在會話中。這是更好的方法。過去我已經完成了這個工作,對我來說這個工作非常可靠。我的結構類型有大約8個道具。 – 2009-11-06 13:18:28
@Curious,你能展示一些你做過的示例代碼嗎? – 2009-11-06 13:20:16
如果性能是一個主要問題,那麼您可能需要考慮優化會話內容的序列化。當您擴展到會話服務器或使用SQL Server管理會話狀態時,序列化/反序列化成爲更大的瓶頸。
會話狀態使用自定義 序列化機制轉換的 會話詞典和其內容 二進制BLOB存儲過程外的一個存儲中的數據 之前。該 序列化機制具有.NET框架基本 類型,包括字符串,布爾值,日期時間 ,時間跨度,Int16的,的Int32, Int64的,字節,字符,單人,雙人, 小數,爲SByte,UINT16,UInt32的直接 支持, UInt64,Guid和IntPtr。 直接寫入團塊這些類型的,而 對象類型被序列與 的BinaryFormatter,這比較慢。 反序列化遵循相同的 規則。通過優化會話 內容,可以顯著降低 序列化的開銷和反序列化 狀態數據。
在設計會話對象 模型時,避免在 會話中存儲對象類型。相反,只會根據會話數據在會話 字典中存儲 基本類型並在每個請求 中重建您的業務 層會話對象。這避免了使用BinaryFormatter的開銷。
與往常一樣,做任何優化前先測量你的表現。
嗨,它只是通常的預防性關注事項儘可能精簡和可讀/可更新。 – 2009-11-06 13:35:22
然後我會去結構。但是,如果您的會話序列化開始成爲瓶頸,那麼您總是可以將結構分開。 – 2009-11-06 13:43:04
- 1. ASP會話變量vs ASP.NET會話變量
- 2. 會話變量asp.net
- 3. Asp.net會話變量
- 4. 每個會話多個對象vs單獨對象
- 5. 單獨會話
- 6. 在會話中存儲對象時會話變量問題
- 7. 如何在jsp中創建會話對象和會話變量?
- 8. asp.net中的會話變量
- 9. 會話變量錯誤asp.net
- 10. 在asp.net中的類對象中調用會話變量
- 11. 動態C#對象會話變量?
- 12. 會話變量
- 13. 會話vs SSL會話
- 14. CodeIgniter會話vs PHP會話
- 15. 在ASP.NET中的會話變量混合?
- 16. PHP - 會話變量性能(會話VAR vs雷丁文件)
- 17. 從會話ID獲取會話對象在ASP.Net
- 18. 的ColdFusion客戶端VS會話變量
- 19. ASP.NET會話 - 大對象vs很多小對象
- 20. 什麼是會話和會話變量?
- 21. 設置會話變量爲paramiko會話
- 22. 在GridView(ASP.NET)中顯示會話變量?
- 23. 會話變量vs數據庫
- 24. 在ASP.NET中使用會話對象
- 25. php變量會話變量
- 26. asp.net會話變量裏面的SharePoint
- 27. 帶變量的ASP.NET會話管理
- 28. 與會話變量的ASP.NET緩存?
- 29. 來自SQL DB的Asp.net會話變量
- 30. ASP.NET的會話變量存儲
Re:Viewstate,這些值存儲在會話中,因爲用戶需要導航離開並返回到頁面,例如添加各種新項目或僅在網站周圍導航時。會話變量存儲會話持續存在的各種類別和過濾器選擇。在這種情況下,會話比Cookie更安全穩定。 – 2009-11-06 13:54:51
@Mark - 這聽起來像Session是更好的選擇。我只想指出,ViewState已加密並存儲在隱藏的表單字段中,並未存儲在Cookie中。 – 2009-11-06 14:05:30
@Jamie - 感謝分享這個解決方案,我進一步走下了這條路線,因此接受答案的變化。 – 2009-11-08 22:24:27