在我的Web應用程序中,我測試一個頁面上的條件,並希望在指定的時間內(例如5分鐘)保留測試結果。當然,我可以用cookie來做到這一點,但爲防萬一用戶禁用了cookies,我認爲一個自定義服務器變量可能會起作用。我聽說過這個,但我一直沒能找到答案。如何設置自定義服務器變量?
另外,也許會話變量可能會更好?有沒有固有的方式來過期,對嗎?在IIS拋棄之前,這樣一個變量能存活多久?
在我的Web應用程序中,我測試一個頁面上的條件,並希望在指定的時間內(例如5分鐘)保留測試結果。當然,我可以用cookie來做到這一點,但爲防萬一用戶禁用了cookies,我認爲一個自定義服務器變量可能會起作用。我聽說過這個,但我一直沒能找到答案。如何設置自定義服務器變量?
另外,也許會話變量可能會更好?有沒有固有的方式來過期,對嗎?在IIS拋棄之前,這樣一個變量能存活多久?
您無法設置服務器變量;相反,使用會話綁定到當前用戶,是基於用戶的數據的最佳方法。對於基於應用程序的數據,您可以考慮緩存。假設前者,請執行:
Session["Key"] = MyValue
請注意,會話持續20分鐘;如果你必須有整整5分鐘,就可以使用緩存,您可以在5分鐘時明確到期:
Cache.Add(CurrentUserID.ToString() + "Key", "Value", .. TimeSpan.FromMinutes(5));
您可以使用當前用戶的ID,使特定的緩存值給用戶,或使用cookie,但在cookie對象上設置HttpOnly=True
。一個HTTPOnly cookie只在服務器上,並且從不在客戶端訪問,因此:
varcookie = New HttpCookie("Key", Value);
cookie.Expires = ..;
cookie.HttpOnly = true;
Asp.Net具有會話狀態。每個Asp.Net頁面都有一個Session
屬性。您也可以通過HttpContext.Current.Session
訪問它,雖然有細微的差別這並不重要,直到它咬你(看到my answer的問題,Difference between Session and HttpContext.Current.Session。
默認的會話狀態配置內存 。這意味着如果您的網站是由F5 Networks Big IP(負載均衡器)集羣提供的,除非負載平衡器設置爲「粘滯」(即一旦分配給集羣中的某臺計算機,您如果你的集羣網站沒有粘性sess,那麼它總是會打到那臺機器上,除非它停機或者從集羣中移除)
如果你的集羣網站沒有粘性sess當你的請求遇到不同的機器時,你的會話狀態將會消失......然後當另一個請求碰到原來的機器時重新出現。你可以猜到可以有多少樂趣。
SQL Server會話的內置支持可以在web.config中啓用。一旦這樣設置,您就使用SQL Server作爲會話狀態的後備存儲。這解決了上面提到的服務器場問題,但是這樣做的代價是每次訪問SQL Server 都會訪問會話狀態值。這會大大降低訪問速度,尤其是在會話規模較大的情況下。奇怪的是,每次訪問會話狀態設置時,執行SQL查詢並在網絡上推送一個500kb的會話博客可能會對性能產生負面影響。誰知道? [不要問我們如何發現]。
還有其他問題的解決方案:ScaleOut's產品浮現在腦海中(例如,ScaleOut SessionServer)。
或者您可以使用類似AppFabric緩存的roll your own session state provider。
使用SQL Server會話狀態的另一個「特性」是進入會話的任何內容必須是ISerializable
。
只是檢查,這是每個用戶會話權?如果他們禁用了Cookie,那麼您將無法跟蹤會話......除非您有'cookieless = true'?會話存在時會存在 –
會話變量。默認情況下,距離上次請求20分鐘。您也可以使用緩存。您可以將項目添加到緩存,過期時間爲5分鐘,然後將其刪除。但是您需要爲每個用戶維護它,因爲所有緩存都是相同的 –