簡體   English   中英

當應用程序池在 ASP.NET MVC 中回收時會發生什么?

[英]What happens when application pool re-cycles in ASP.NET MVC?

我大量使用 Session 來存儲來自客戶端的已發布請求的數據在服務器上。 在研究中,stackoverflow 上的各種答案都指向我,不要在 ASP.NET MVC 中使用 Session。 主要原因是:應用程序池在生產服務器的生命周期內頻繁回收,這也會導致會話回收。

這就是為什么我想用可反序列化的字符串“....”替換會話對象。 我的全部擔憂是:包含此字符串的單例對象(可反序列化為 Objects )不得在應用程序池回收時損壞/回收或重新初始化。

所以我的最后一個問題是:應用程序池回收會發生什么? 只有會話回收? 或者整個內存重新循環並重新初始化?

我的目標網絡服務器:Microsoft ASP.NET with MVC

當應用程序回收時,該站點在w3wp.exe運行的 Windows 進程結束並創建一個新進程。 一個站點也可能有一個應用程序池的多個工作進程。 在這種情況下,它們都結束並且 1 旋轉,並且將根據需要創建新的工作進程。

發生這種情況時,網站代碼存儲在內存中的任何內容都會丟失。 這包括正在進行的會話信息。

但是 .Net 會話狀態可以在兩種模式下工作,進程中或數據庫中。 可以運行aspnet_regsql工具在sql server中創建一個數據庫來存儲會話信息。 然后您可以更改 web.config 以在數據庫中運行會話。 您可以使用相同的會話 API,它們在兩種模式下的工作方式相同。 但是將其置於數據庫模式會導致它將所有內容持久化到數據庫中,而不是在進程內存中。 然后當 AppPool 回收時,你不會失去任何東西。

RegSql 文檔: https ://msdn.microsoft.com/library/ms229862(v = vs.100).aspx

一個設計良好的 ASP.Net 站點(無論是 MVC、Web Forms、WebApi(1/2))等都應該被設計成能夠從任何回收中完全恢復。 網站回收不應破壞您的網站。

回收應用程序池將吹走您的 AppDomain 及其中的所有內容,包括所有靜態值。

這就是它首先丟失會話狀態的原因。

你可能想要一個數據庫。

SLaks 幾乎回答了你的問題。 這是解決方案 -

在 ASP.Net MVC 中,我們不像 Web Form 那樣使用會話狀態。

但是,您仍然可以使用會話狀態,但您希望使用外部會話狀態提供程序而不是默認的InProc 模式- 值和變量存儲在本地 Web 服務器的內存中。

你有幾個選擇——

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM