我有一個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可以在你所要禁用回收上的虛擬文件夾指定子目錄?
是否有另一種方式做到這一點,而無需使用反射?
有沒有一些原因,上傳文件夾不能在webroot之外? – fyjham 2010-01-20 01:48:56
上傳文件夾主要用於圖像,我希望能夠在用戶被刪除之前將圖像顯示給用戶。 – Crackerjack 2010-01-20 16:34:03
您可以將上傳文件夾放在webroot之外,並在指向它的應用程序內創建一個虛擬目錄。我不確定這是否會阻止回收。您也可以從webroot外部流式傳輸圖像(只需創建一個ASPX頁面或從上傳文件夾讀取的處理程序)。 – technophile 2010-02-05 18:07:45