2010-01-20 40 views
2

我有一個asp.net web應用程序,它允許用戶將文件上傳到位於與web應用程序相同的虛擬目錄中的「uploads」目錄。每個上傳的文件都會進入以用戶會話ID命名的臨時子目錄。一旦我完成了這些文件,我就刪除了temp子目錄。唯一的問題是當一個子目錄被刪除時,AppDomain被回收並且殺死所有用戶會話(使用inproc會話狀態)。罪魁禍首似乎是一個FileChangesMonitor,用於監視應用程序中所有子目錄中的更改。如何在刪除子目錄時防止AppDomain在IIS 7.0中回收?

下面的代碼在IIS 6.0的偉大工程的Windows Server 2003上運行,以禁用子目錄FileChangesMonitor,但由於某種原因它不是在IIS 7.0的Windows Server 2008上運行:

System.Reflection.PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); 
object o = p.GetValue(null, null); 
System.Reflection.FieldInfo f = o.GetType().GetField("_dirMonSubdirs", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.IgnoreCase); 
object monitor = f.GetValue(o); 
System.Reflection.MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
m.Invoke(monitor, new object[] { }); 

我發現了另一個解決方案禁用FileChangesMonitor一起here。但這不是理想的解決方案,因爲我仍然想要監視除「上傳」目錄中的臨時子目錄之外的所有其他文件。

爲什麼這項工作在IIS 6.0中,而不是在IIS 7.0?

在IIS 7.0可以在你所要禁用回收上的虛擬文件夾指定子目錄?

是否有另一種方式做到這一點,而無需使用反射?

+2

有沒有一些原因,上傳文件夾不能在webroot之外? – fyjham 2010-01-20 01:48:56

+0

上傳文件夾主要用於圖像,我希望能夠在用戶被刪除之前將圖像顯示給用戶。 – Crackerjack 2010-01-20 16:34:03

+0

您可以將上傳文件夾放在webroot之外,並在指向它的應用程序內創建一個虛擬目錄。我不確定這是否會阻止回收。您也可以從webroot外部流式傳輸圖像(只需創建一個ASPX頁面或從上傳文件夾讀取的處理程序)。 – technophile 2010-02-05 18:07:45

回答

2

fyjham是正確的......你需要移動上傳文件夾根目錄之外。如果這是一個面向公衆的網站,將它置於Webroot下面會帶來安全風險。

0

要回答我的問題,我與IIS 7.0玩了一圈,發現的是,當託管管道模式設置爲「綜合」上的應用程序池,上面的反射代碼沒有工作。確保將應用程序池的管理管道模式設置爲「Classic」。

似乎也沒有辦法通過IIS手動禁用此任。

+0

我有類似的問題。但是,我發現StopMonitoring更改適用於我,無論我是否使用Integrated或Classic管道。 http://stackoverflow.com/questions/2248825/asp-net-restarts-when-a-folder-is-created-renamed-or-deleted – frankadelic 2010-02-12 23:39:49

相關問題