2009-08-26 155 views
2

我剛剛在一週前注意到這一點。我正在存儲關於用戶正在玩的當前難題(www.wikipediamaze.com)的數據,如下所示:InProc會話數據消失

HttpContext.Current.Session.Add(「puzzleInfo」,currentPuzzleInfo);

我知道使用「InProc」模式在會話中存儲數據非常不穩定,每當web.config發生更改或任何其他因素(包括回收應用程序池)時都會重置。

但是,我的數據一次只停留幾秒鐘(時間是可變的,但字面上不長),然後消失。我處於共享託管環境中,因此我不知道這與它有什麼關係。

任何想法是怎麼回事?將我的產品作爲cookie直接存儲在客戶端上會更好嗎?請幫忙。

謝謝!

回答

3

故障排除

丟失數據每隔幾秒鐘是不尋常的,有可能可能是與你共享的託管服務提供商的一個問題 - 聽起來像服務器不斷下降出於某種原因會話。您可以顯示sessionID(Session.SessionID)並查看它是否發生更改。

服務器上的其他人可能導致進程崩潰。這裏有一個關於解決這種類型的問題(向下滾動約25%的方式)的msdn博客文章:http://blogs.msdn.com/webtopics/archive/2009/07/22/in-proc-session-state-management.aspx

這對共享主機環境中的你沒有多大幫助,但是你可以將它傳遞給支持鏈。也許他們可以查看事件日誌並確定誰在破壞IIS併爲其啓動。

如前所述由肖恩·麥克唐納:

...給你在一個共享的主機 環境的時候,有一個像樣的機會 有多個Web服務器託管 您的網站。如果多個服務器 所服務站點和負載 平衡機制是在使用該 不保持任何形式的會議 親和力,你可以簡單地彈跳 到不同的Web服務器,並開始 一個新的會話;畢竟,在進程 會議是不會跟着你 跨框。

替代國有持久性

無論如何,我一直覺得是InProc是即使在專用服務器上間歇性地不可靠的,所以我儘量避免它。

對cookies保持謹慎 - cookie會隨着每個請求(圖片,腳本等)一起傳輸,並且應該保持最低限度。你可能會想,「呃,這個項目並不需要擴展」,但是一旦你做出項目範圍的設計決定,你將使用cookies來堅持你的狀態,你就會肆無忌憚地cru bru不前。

而我的意思是,你正在走出最佳實踐,並可能遇到一些醜陋的情況,就像那時我需要持續一秒鐘的XML文檔。這不會是一個好主意!

如果您沒有辦法設置會話狀態服務器(這很容易),因爲您處於共享主機環境,您可以查看SqlSessionStateStore,它可以讓您存儲會話數據在SQL Server中。

3

布賴恩的建議非常好,我完全同意他提出的觀點。我還想提供一個額外的可能性。

你對託管應用程序的環境瞭解多少?我請求以下原因:鑑於您處於共享主機環境中,承載您的網站的網站服務器不止一個。如果多個服務器正在爲您的站點提供服務,並且正在使用的負載平衡機制不會保持任何類型的會話關聯性,那麼您可以簡單地反彈到不同的Web服務器並開始新的會話;畢竟,進程內的會話不會跟着你穿過盒子。

思考:-)

+0

偉大的一點。 Upvote,但標記爲答案。 – Micah 2009-08-26 16:06:46

+0

好想,肖恩。希望他們不會這樣做,沒有會話親和力,但你永遠不知道... – 2009-08-26 16:36:58

+0

嘿......是的,我希望他們不會反彈請求周圍沒有建立親和力(至少不說),但計算它不會傷害提及它:-)無論如何,高興Micah從Brian獲得他需要的答案! – 2009-08-26 18:23:43