2011-02-15 47 views
1

出於某種原因,會話正在放棄,並在應用程序中造成嚴重破壞。我們已經安裝了應用程序來使用Session,並且已經使用了幾個月而沒有任何問題。現在,當我們添加額外的內容並在其中存儲更多信息時,Session在20分鐘超時之前就已經傾倒得比預期的要好。我爲什麼......因爲我們可能會在會話中添加大量數據(不確定確切的大小)而陷入虧損之中?畢竟這是我的本地機器(Win 7,使用IIS,ASP.NET 4.0,4 GB RAM)。放棄ASP.NET會話

或者是否還有其他的原因呢?有什麼想法嗎?

謝謝。

+1

我知道,我上我的託管服務提供商,隨機循環會話。我不得不使用會話狀態服務器來維護它,否則每個人都會立即註銷。不知道這是否適用於此。 – Chev 2011-02-15 20:19:08

回答

1

我假設你正在使用會話狀態in-proc。如果是這種情況,那麼丟失Session的最常見原因是相應的應用程序池回收。去檢查應用程序池上的IIS設置,併爲這些事件設置事件日誌條目。你會發現在設置:「高級設置」您的應用程序池的 - >「回收」 - >「生成回收事件日誌條目」。將它們全部設置爲true,看看它是否會給你會話狀態丟失的原因。

此外,如果您更改給定網站上的數據很多,它最終會觸發應用程序池回收。

上的應用程序池回收更多的想法:
http://blogs.msdn.com/b/johan/archive/2007/05/16/common-reasons-why-your-application-pool-may-unexpectedly-recycle.aspx

2

ASP.Net會話存儲在緩存中。如果你的內存不足,它將被丟棄。您需要將會話存儲在數據庫或其他存儲中以保留該會話。我會盡力找到相關的鏈接。會話並不意味着存儲大量數據!

以下是解釋如何使用out-of-process sessions的鏈接。基本上這個想法是,默認情況下,ASP.Net/IIS將使用進程內會話(最快),但也受運行IIS的服務器上的電源/存儲限制。備選方案是使用會話狀態服務器場或SQL服務器來存儲會話。這些速度稍慢,但提供更大的靈活性。您需要考慮將會話序列化到您的決定中的能力。


這是從一本書中我一直在讀(編程Microsoft ASP.NET 3.5的迪諾·埃斯波西託)的摘錄:

爲什麼我的會話狀態有時也會找不着?

當工作模式是InProc時,會話狀態被映射到服務頁面請求的AppDomain的內存空間。鑑於此,會話狀態受制於進程回收,並且AppDomain重新啓動。正如我們在第2章中討論的那樣,ASP.NET工作進程會定期重啓以保持平均的良好性能;當發生這種情況時,會話狀態會丟失。進程回收取決於內存消耗的百分比以及可能的服務請求數量。雖然這個過程是循環的,但是對週期的間隔沒有一般的考慮。在設計基於會話的進程內應用程序時請注意這一點。作爲一般規則,請記住,當您嘗試訪問會話狀態時,會話狀態可能不存在。根據您的應用程序使用異常處理或恢復技術。

在知識庫文章Q316148,Microsoft建議一些殺毒軟件可能會被標記在Web.config或Global.asax文件的修改,從而導致要啓動新的應用程序,並隨後使會話狀態的丟失。如果您或您的代碼修改這些文件的時間戳,這也適用。另外,任何對Bin目錄的添加或刪除都會導致應用程序重新啓動。

注意:當運行中的頁面遇到錯誤時,會話狀態會發生什麼?當前的字典會被保存還是丟失?如果在請求結束時頁面導致錯誤 - 即服務器對象的GetLastError方法返回異常,則會話狀態不會被保存。但是,如果在您的異常處理程序中通過調用Server.ClearError來重置錯誤狀態,則會定期保存會話的值,就好像沒有錯誤發生過一樣。