ОБНОВЛЕНИЕ - обрабатывает для тиражирования проблемы:
1) Создайте проект веб-сайта в c:\projects\restart-demo
2) Добавьте значение по умолчанию web.config и макет aspx страница test.aspx
3) Отобразите IIS для указания на корневую папку c:\projects\restart-demo
4) Перезапуски приложения монитора с помощью perfmon, медицинский контроль, отслеживание в global.asax Application_End, и т.д.
5) Страница запроса в браузере http://localhost/test.aspx
приложение запускается
6) Создайте новую папку c:\projects\restart-demo\asdf
конец приложения
7) Страница запроса в браузере http://localhost/test.aspx
приложение запускается
8) Переименуйте папку c:\projects\restart-demo\asdf к c:\projects\restart-demo\asdf1
конец приложения
обновление конца
Мы используем бэкенд CMS для генерации файлов и папок в сайте ASP.NET.
Пользователи могут создать/изменить/удалить файлы и выставить их к веб-ферме.
Одна проблема мы заметили:
Когда пользователь создает, переименовывает или удаляет папку, она заставляет Домен Приложения перезапускать. Как следствие сессия, кэш, и т.д. все проиграна.
Обратите внимание, что это не должна быть специальная папка как / мусорное ведро или/App_Code также.
Там какой-либо путь состоит в том, чтобы предотвратить это поведение?
Это действительно препятствует производительности по двум причинам:
Этот код, кажется, решает проблему при добавлении в Application_Start () в Global.asax:
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[] { });
С этими изменениями я могу создавать / изменять / удалять папки, не вызывая перезапуска приложения.
Неясно, является ли это лучшим решением - не знаю, возникнут ли нежелательные побочные эффекты из-за вызова StopMonitoring.
Включить Мониторинг работоспособности ASP.NET и просмотрите журнал событий, чтобы узнать, почему перезапустился домен приложения.
Бьюсь об заклад, это потому, что вы использовали проект веб-сайта, а не проект веб-приложения. Попробуйте воспроизвести это с помощью проекта веб-приложения.
Кроме того, есть ли у вас какие-либо антивирусные программы или программы для индексирования? Такое программное обеспечение уведомляет о создании и / или изменении папок.
По умолчанию приложение asp.net будет перезапускаться каждый 15-й раз при изменении файла в его виртуальном каталоге, это должно перевесить частичные перекомпиляции и их вес памяти по сравнению с общим производительность ... вы можете изменить это поведение, но использование памяти может возрасти, а производительность со временем упасть.
Для этого установите атрибут numRecompilesBeforeAppRestart в элементе компиляции , ваш web.config будет иметь такой элемент en:
<configuration>
<system.web>
<compilation numRecompilesBeforeAppRestart="15">
По умолчанию 15, вы можете изменить его на все, что захотите, прочтите ссылку для получения дополнительной информации. Однако это так по причине : не рекомендуется размещать динамический контент внутри виртуального каталога приложения, лучше всего иметь его рядом с ним или где-то еще.