Asp.net

創建、重命名或刪除文件夾時 ASP.NET 重新啟動

  • November 16, 2016

更新——複製問題的過程:

1) 在c:\projects\restart-demo創建一個網站項目

  1. 添加預設 web.config 和一個虛擬 aspx 頁面test.aspx

  2. 映射 IIS 指向根文件夾c:\projects\restart-demo

  3. 使用 perfmon 監控應用程序重啟、健康監控、跟踪 global.asax Application_End 等。

5)瀏覽器中的請求頁面<http://localhost/test.aspx>

應用程序啟動

  1. 創建新文件夾c:\projects\restart-demo\asdf

申請結束

  1. 瀏覽器中的請求頁面<http://localhost/test.aspx>

應用程序啟動

  1. 將文件夾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 是否會產生不必要的副作用。

引用自:https://stackoverflow.com/questions/2248825