Как предотвратить повторное использование AppDomain в IIS 7.0 при удалении подкаталога? - PullRequest
3 голосов
/ 20 января 2010

У меня есть веб-приложение 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 вы можете указать подкаталоги в виртуальной папке, для которой вы хотите отключить утилизацию?

Есть ли другой способ сделать это без использования отражения?

Ответы [ 2 ]

2 голосов
/ 20 января 2010

@ fyjham прав, вам нужно переместить папку загрузки за пределы webroot.Если это общедоступный сайт, то его наличие под webroo t является угрозой безопасности с самого начала.

0 голосов
/ 05 февраля 2010

Чтобы ответить на мой собственный вопрос, я поигрался с IIS 7.0 и обнаружил, что, когда режим управляемого конвейера был установлен как «Интегрированный» в пуле приложений, вышеуказанный код отражения не работал. Вместо этого установите режим управляемого конвейера пула приложений в «Классический».

Также не представляется возможным отключить это вручную через IIS.

...