我正在修復大量使用會話來跟蹤每頁數據的ASP.NET應用程序。其中一個問題是會話在頁面之間流血。使用像ViewState這樣的會話
ViewState的將是一個更好的解決辦法,除非:
- 的數據是不可序列
- 有太多的數據每次回發
所以我想被髮送來回:
- 爲會話數據創建頁面密鑰(即在隱藏字段中粘貼一個隨機GUID)
- 從一個廢棄的頁面過期數據,即使整個會話活躍
是否有到期部分會話的數據的好方法嗎?
我正在修復大量使用會話來跟蹤每頁數據的ASP.NET應用程序。其中一個問題是會話在頁面之間流血。使用像ViewState這樣的會話
ViewState的將是一個更好的解決辦法,除非:
所以我想被髮送來回:
是否有到期部分會話的數據的好方法嗎?
下的臨時存儲位置可供選擇:
您可能需要檢查緩存。如果您使用的是網站農場,它不起作用,但您可以使用某種類型的GUID作爲您映射回會話的密鑰。
如果我可以保證緩存可能會在會話持續20分鐘左右的時間內完成。 – Korey 2009-08-13 15:34:32
這裏是我使用的緩存代碼: Cache.Insert(key,value,null,System.Web.Caching.Cache.NoAbsoluteExpiration,new TimeSpan(0,20,0),System.Web.Caching.CacheItemPriority.NotRemovable , 空值); – Korey 2009-08-14 20:54:29
CacheItemPriority.NotRemovable阻止Cache由於內存壓力而刪除數據。 – Korey 2009-08-14 20:55:02
也許在每個頁面!IsPostBack或通過基本頁面,您可以清空所有對與該頁面無關的會話數據的引用。每次用戶轉到站點中的其他頁面時,這會使數據「過期」。
如果用戶離開網站或處於非活動狀態,則在會話過期之前可以做的事情不多,但在這種情況下,每個用戶只有一頁會話數據。
我確實希望允許查看多個頁面(同一頁面,但具有不同的請求數據)。我不希望一個頁面自動銷燬另一個會話數據,我只是希望它能夠過期。 – Korey 2009-08-13 15:35:34
我可能會做這種方式:
像這樣的東西(警告:空氣代碼可能包含語法錯誤):更多
public class PageBase
: System.Web.UI.Page
{
protected overrides OnInit(System.EventArgs e) {
base.OnInit(e);
if(!this.IsPostBack) {
Guid requestToken = System.Guid.NewGuid();
ViewState["RequestToken"] = requestToken;
Session["PageSpecific" & requestToken.ToString()] = InitializePageSpecificState();
}
}
protected virtual object InitializePageSpecificState() {
return new GenericPageState();
}
//You can use generics to strongly type this, if you want to.
protected object PageSpecificState {
get {
return Session["PageSpecific" & ViewState["RequestToken"].ToString()];
}
}
}
這與以前的答案有相同的問題。我的問題可能不夠清楚。 某些用戶可能在多個選項卡中查看Default.aspx,並使用不同的請求數據(甚至相同)。我希望每個人都有自己的服務器端存儲空間。 – Korey 2009-08-13 15:42:15
@Korey這將是一個好東西編輯到您原來的問題。它也很容易解決:在初始加載時生成某種形式的令牌(如Guid)。將其附加到會話密鑰(會話[「PageSpecific」&requestToken])。將密鑰存儲在ViewState中。 – AaronSieb 2009-08-13 16:30:05
@Korey允許多個選項卡打開的主要困難是您無法從請求中清除會話,直到整個會話過期爲止......這可能會也可能不會成爲問題,具體取決於您的大小用戶羣。 – AaronSieb 2009-08-13 16:35:45
有點信息將是有益的。您是否試圖爲每個頁面存儲相同的數據結構,或者每個頁面有唯一的數據結構?爲什麼會話數據在用戶離開後閒逛會出現問題? – 2009-08-13 13:32:16
@Christian Hayter他的問題意味着多個頁面使用相同的會話密鑰。因此,針對頁面A的數據將留在會話中供頁面B查找。 – AaronSieb 2009-08-13 13:51:26
AaronSieb是正確的。 – Korey 2009-08-13 15:43:41