Asp.net
創建、重命名或刪除文件夾時 ASP.NET 重新啟動
更新——複製問題的過程:
1) 在c:\projects\restart-demo創建一個網站項目
添加預設 web.config 和一個虛擬 aspx 頁面test.aspx
映射 IIS 指向根文件夾c:\projects\restart-demo
使用 perfmon 監控應用程序重啟、健康監控、跟踪 global.asax Application_End 等。
5)瀏覽器中的請求頁面<http://localhost/test.aspx>
應用程序啟動
- 創建新文件夾c:\projects\restart-demo\asdf
申請結束
- 瀏覽器中的請求頁面<http://localhost/test.aspx>
應用程序啟動
- 將文件夾c:\projects\restart-demo\asdf重命名 為 c:\projects\restart-demo\asdf1
申請結束
結束更新
我們正在使用後端 CMS 在 ASP.NET 站點中生成文件和文件夾。
使用者能夠創建/修改/刪除文件並將它們推送到網路場。
我們注意到的一個問題:
當使用者創建、重命名或刪除文件夾時,會導致 App Domain 重新啟動。結果,會話、記憶體等都失去了。
請注意,它也不需要是像 /bin 或 /App_Code 這樣的特殊文件夾。
有什麼辦法可以防止這種行為?
它確實阻礙了性能,原因有兩個:
- 應用域重啟時記憶體被轉儲
- 重啟後需要重新建app域
當添加到 Global.asax 中的 Application_Start() 時,此程式碼似乎可以解決該問題:
PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); object o = p.GetValue(null, null); FieldInfo f = o.GetType().GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase); object monitor = f.GetValue(o); MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic); m.Invoke(monitor, new object[] { });<http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/12/disable-session-expiration-when-using-directory-delete.aspx>
通過這些更改,我可以創建/修改/刪除文件夾而不會導致應用程序重新啟動。
不清楚這是否是最好的解決方案——不知道呼叫 StopMonitoring 是否會產生不必要的副作用。