例如,我在ASP.NET應用程序中廣泛使用會話,但聽說某處存儲會話的對象可以被服務器內存不足的系統刪除。這是真的?是否有任何會話「回調」功能允許您重新填充清除的對象?使用ASP.NET會話狀態時有哪些常見問題和最佳實踐?
更一般地,還有什麼其他的潛在使用會話狀態的問題在那裏,什麼是處理這些問題的建議最佳做法?
例如,我在ASP.NET應用程序中廣泛使用會話,但聽說某處存儲會話的對象可以被服務器內存不足的系統刪除。這是真的?是否有任何會話「回調」功能允許您重新填充清除的對象?使用ASP.NET會話狀態時有哪些常見問題和最佳實踐?
更一般地,還有什麼其他的潛在使用會話狀態的問題在那裏,什麼是處理這些問題的建議最佳做法?
對不起,我不知道該去除會話狀態的項目,但在應對你的一般性問題,最重要的問題是你是否預料只是一個Web服務器計算機或許多上運行的Web應用程序。
通常,您將會話狀態保存在一臺計算機的內存中。您的多個Web服務器前面的負載均衡器必須配置爲使事物「粘性」,以便同一用戶保持路由到同一臺計算機。
或者,你可以存儲會話狀態在一箇中心位置,包括SQL Server,但你付的性能損失爲網絡和與SQL Server IO互動。在記憶狀態下,你放棄本地的速度。
由於會話狀態默認爲20分鐘,如果您需要的不止於此,但您的託管公司不會讓您覆蓋它,那麼您必須在網頁中運行一些ajax或隱藏的iframe JavaScript代碼將ping服務器每隔(小於)20分鐘保持會話aliv
和每一個應用程序池重新啓動,以及時間,例如,創建一個設置會話變量的網頁,並顯示在頁面上,現在,更新你的BIN,APPCode,全球或本地資源文件夾,你會看到會話將被刪除。
而且在共享主機環境的原因,他們阻止會話超時正常20分鐘,不管查看Session.Timeout值,你會忘,這將是棘手的。
由於這個以及更多我使用SQL會話的原因,Web應用程序有點慢,導致一切(會話)都在SQL Server中,而不是在內存中,但是您對它有更多的控制權,您可以設置會話超時到任何你想要的!在我的情況下非常好,因爲我希望他們在更新應用程序時繼續工作(非常糟糕,每次更新APP代碼文件夾時,所有用戶都將失去他們正在工作並且必須重新登錄的內容),而且我想要在共享託管20分鐘擴大到45
瞭解更多關於SQL Session State
您確定App_Data的更新會導致會話狀態丟失嗎?我正在更新App_Data的子文件夾中的文件,並且不會導致會話狀態被重置。 – 2008-11-16 13:34:20
無論你使用何種預防措施,總是假定您的會話可能會消失,仔細檢查:
Dim sessionObj As Object = CType(Session("SessionKey"), Object)
If sessionObj Is Nothing
sessionObj = ReCreateObj()
Session("SessionKey") = sessionObj
End If
object sessionObj = Session["SessionKey"] as object ;
if(sessionObj == null)
{
sessionObj = ReCreateObj();
Session["SessionKey"] = sessionObj;
}
一個Session包裝工程對於這一點,所以你沒有檢查你訪問你的Session vars的地方。
我有好運氣custom Session-State Providers。一對夫婦有用的調整包括:
我肯定會看到,如果三個standard Session modes之一執行之前,你必須支持。自定義會話很有用,一旦你更瞭解你的應用程序的古怪需求。
由於會話狀態默認爲20分鐘,如果您需要的不止於此,但您的託管公司不會讓您覆蓋它,您將不得不在網頁中運行一些ajax或隱藏的iframe JavaScript代碼,每隔(不到)20分鐘ping服務器以保持會話存活 – 2008-11-16 13:41:43