У меня есть веб-приложение ASP.Net, которое позволяет пользователям загружать файлы в каталог uploads
, расположенный в том же виртуальном каталоге, что и веб-приложение.Каждый загруженный файл попадает во временный подкаталог, который назван в честь идентификатора сеанса пользователя.Как только я закончу с файлами, я удаляю временный подкаталог.Единственная проблема заключается в том, что при удалении подкаталога AppDomain
перезапускается и уничтожает все пользовательские сеансы (используя inproc
состояние сеанса).Похоже, виновником является FileChangesMonitor
, который отслеживает изменения во всех подкаталогах приложения.
Следующий код прекрасно работает в 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
в целом здесь .Но это не идеальное решение, так как я все еще хочу отслеживать все другие файлы, кроме временных подкаталогов в каталоге uploads
.
Почему это работает в IIS 6.0, а не в IIS 7.0?
В IIS 7.0 вы можете указать подкаталоги в виртуальной папке, для которой вы хотите отключить утилизацию?
Есть ли другой способ сделать это без использования отражения?