17

更新 - 過程複製問題:ASP.NET重新啓動時創建一個文件夾,重命名或刪除

1)c。創建一個網站項目:\項目\重啓演示

2)添加默認的web.config和虛擬aspx頁面Test.aspx的

3)地圖IIS指向的根文件夾C:\項目\重啓演示

4)使用性能監視器,健康監測監控應用程序重新啓動,在Global.asax的Application_End跟蹤等

5)在瀏覽器請求頁面http://localhost/test.aspx

應用程序啓動

6)創建新的文件夾C:\項目\重啓演示\ ASDF

結束應用程序

7)在瀏覽器請求頁面http://localhost/test.aspx

應用程序啓動

8)重命名文件夾C:\項目\重啓演示\ ASDFC:\項目\重啓演示\ asdf1

應用結束

結束更新

我們使用後端CMS在ASP.NET網站中生成文件和文件夾。

用戶能夠創建/修改/刪除文件,推動這些到了Web農場。

的一個問題,我們注意到:

當用戶創建,重命名或刪除一個文件夾,它會導致應用程序 域重新啓動。因此,會話,緩存等全部丟失。

注意它並不需要像/ bin或/ App_Code文件的特殊文件夾兩種。

有什麼辦法來防止這種行爲?

這實在是阻礙業績的原因有兩個:

  • 緩存被轉儲應用程序域重新啓動時
  • 應用程序域需要重新啓動後重新建立
+1

這是否發生在100%的時間,或者說,創造了某個數字,就像每第15次更改一樣? – 2010-02-12 00:37:12

+0

你描述的行爲並不典型。你能否給我們提供一些更具說明性的信息代碼? – 2010-02-12 00:39:47

+0

@尼克:每次都會發生這種情況。 – frankadelic 2010-02-12 00:47:52

回答

15

此代碼出現來解決問題,在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而產生不必要的副作用。

+1

看起來像一個巨大的黑客,但如果它的作品,我猜你沒有選擇。 +1用於報告您的解決方案。 – mxmissile 2010-02-12 21:23:29

+0

另外還有一個更完整的示例,說明如何在此處執行此操作:http://www.aaronblake.co.uk/blog/2009/09/28/bug-fix-application-restarts-on-directory-delete-in- ASP-NET / – 2010-03-16 08:25:54

0

啓用ASP.NET Health Monitoring,並期待在事件日誌以查看爲什麼AppDomain重新啓動。


我敢打賭,這是因爲您使用了網站項目而不是Web應用程序項目。嘗試用Web應用程序項目來重現這一點。

另外,你有沒有運行任何防病毒或索引軟件?此類軟件會通知何時創建和/或修改文件夾。

+0

事件消息:應用程序正在關閉。原因:未知。 – frankadelic 2010-02-12 01:07:41

+0

剛剛嘗試使用Web應用程序項目。同樣的問題。 – frankadelic 2010-02-12 01:45:12

+0

感謝您的檢查。在這種情況下,我建議你尋找反病毒軟件和索引軟件。每當創建文件夾時,ASP.NET都不會導致重新啓動 - 其他情況_is_。 – 2010-02-12 01:50:50

2

默認情況下,一個asp.net應用程序會每隔15次重新啓動一個文件在其虛擬目錄中改變,這將超過部分重新編譯及其內存權重與整體性能......您可以更改此行爲,但內存使用可能會隨着時間的推移,表現會下降。

要做到這一點,設置numRecompilesBeforeAppRestart attribute on the compilation element,你的web.config必須連接元件是這樣的:

<configuration> 
    <system.web> 
    <compilation numRecompilesBeforeAppRestart="15"> 

默認值是15,你可以把它改成任何你想要的,讀的鏈接以獲得更多信息。但是,這是因爲的原因,不建議將動態內容放在應用程序的虛擬目錄中,最好將其放在應用程序的旁邊或其他位置。

+0

沒有重新編譯。我只是創建空文件夾。 此外,我已經調整了numRecompilesBeforeAppRestart,每次創建/修改/刪除文件夾時,Application_End仍會觸發。 – frankadelic 2010-02-12 00:53:03

+0

@frankadelic - 你可以更新一個正在創建的幾個文件夾的例子嗎? – 2010-02-12 01:01:56

+0

添加了複製問題的步驟。 – frankadelic 2010-02-12 01:08:25

9

也許有點遲了,但是將臨時文件存儲並處理到應用程序wwwroot之外的其他文件夾中也可以解決此問題。

2

添加"fcnMode="Disabled"web.config<httpRuntime>設置禁用的AppDomain回收時,Web根文件夾的內容被改變。