ASP.NET перезапускается, когда папка создается, переименовывается или удаляется
UPDATE - процесс репликации проблемы:
1) Создайте проект веб-сайта c:\projects\restart-demo
2) Добавьте файл web.config по умолчанию и страницу dummy 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.
Пользователи могут создавать/изменять/удалять файлы и выталкивать их в веб-ферму.
Одна проблема, которую мы заметили:
Когда пользователь создает, переименовывает или удаляет папку, он вызывает приложение Домен для перезагрузки. Как следствие, сеанс, кеш и т.д. все потеряны.
Заметьте, что не обязательно должна быть специальная папка, например /bin или/App_Code.
Есть ли способ предотвратить это поведение?
Это действительно затрудняет работу по двум причинам:
- Кэш удаляется при перезагрузке домена приложения
- После перезагрузки домен приложения необходимо перезагрузить.
Ответы
Ответ 1
Этот код, как представляется, разрешает проблему при добавлении в 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[] { });
http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/12/disable-session-expiration-when-using-directory-delete.aspx
С этими изменениями я могу создавать/изменять/удалять папки, не заставляя приложение перезагружаться.
Не понятно, если это лучшее решение. Не знаете, будут ли нежелательные побочные эффекты из-за вызова StopMonitoring.
Ответ 2
Возможно, немного поздно, но сохранение и обработка ваших временных файлов в другой папке вне wwwroot вашего приложения также решает проблему.
Ответ 3
По умолчанию приложение asp.net будет перезагружаться каждые 15 раз, когда файл изменяет его виртуальный каталог, это перевешивает частичную перекомпиляцию и их вес памяти против общей производительности... вы можете изменить это поведение, но использование памяти может увеличиться и производительность со временем снизится.
Чтобы сделать это, установите атрибут numRecompilesBeforeAppRestart в элементе компиляции, ваш файл web.config будет иметь следующий элемент:
<configuration>
<system.web>
<compilation numRecompilesBeforeAppRestart="15">
Значение по умолчанию - 15, вы можете изменить его на все, что хотите, прочитайте ссылку для получения дополнительной информации. Однако это по какой-либо причине, не рекомендуется иметь динамический контент внутри виртуального каталога приложения, лучше всего иметь его рядом с ним или где-то еще полностью.
Ответ 4
Включите Мониторинг работоспособности ASP.NET и посмотрите в журнале событий, чтобы узнать, почему перезапуск AppDomain.
Я уверен, это потому, что вы использовали проект веб-сайта, а не проект веб-приложения. Попробуйте воспроизвести это с помощью проекта веб-приложения.
Кроме того, есть ли у вас антивирусное или индексирующее программное обеспечение? Такие уведомления о программном обеспечении, когда папки создаются и/или изменены.
Ответ 5
Добавление "fcnMode="Disabled"
в параметры <httpRuntime>
в web.config
отключает повторную загрузку AppDomain при изменении содержимого корневой папки веб-сайта.