ASP.NET перезапускается при создании, переименовании или удалении папки - PullRequest
17 голосов
/ 12 февраля 2010

ОБНОВЛЕНИЕ - процесс для репликации проблемы:

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.

Пользователи могут создавать / изменять / удалять файлы и отправлять их в веб-ферму.

Одна проблема, которую мы заметили:

Когда пользователь создает, переименовывает или удаляет папку , он вызывает приложение Домен для перезапуска. Как следствие, сеанс, кеш и т. д. все потеряно.

Обратите внимание, что это не обязательно должна быть специальная папка, такая как / bin или / App_Code.

Есть ли способ предотвратить такое поведение?

Это действительно снижает производительность по двум причинам:

  • Кэш сбрасывается при перезапуске домена приложения
  • Домен приложения необходимо перестроить после перезапуска

Ответы [ 5 ]

15 голосов
/ 12 февраля 2010

Этот код появляется для решения проблемы при добавлении в 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.

9 голосов
/ 28 апреля 2011

Возможно, немного поздно, но хранение и обработка ваших временных файлов в другой папке за пределами wwwroot вашего приложения также решает проблему.

2 голосов
/ 16 ноября 2016

Добавление "fcnMode="Disabled" в настройки <httpRuntime> в web.config отключает перезапуск AppDomain при изменении содержимого корневой веб-папки.

2 голосов
/ 12 февраля 2010

По умолчанию приложение asp.net перезапускается каждый пятнадцатый раз, когда файл изменяется в его виртуальном каталоге, это перевешивает частичные перекомпиляции и их вес памяти по сравнению с общей производительностью ... вы можете изменить это поведение, но использование памяти может возрасти и производительность снизится со временем.

Для этого установите атрибут numRecompilesBeforeAppRestart в элементе компиляции , ваш web.config будет иметь элемент en, подобный этому:

<configuration>
  <system.web>
    <compilation numRecompilesBeforeAppRestart="15">

По умолчанию установлено значение 15, вы можете изменить его на любое, прочитайте ссылку для получения дополнительной информации. Однако именно по этой причине , не рекомендуется размещать динамический контент в виртуальном каталоге приложения, лучше всего, чтобы он был рядом с ним или где-то еще целиком.

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

Включить Мониторинг состояния ASP.NET и посмотреть в журнале событий, чтобы узнать, почему перезапущен домен приложений.


Бьюсь об заклад, это потому, что вы использовали проект веб-сайта, а не проект веб-приложения. Попробуйте воспроизвести это с помощью проекта веб-приложения.

Кроме того, работает ли у вас какое-либо антивирусное или индексное программное обеспечение? Такое программное обеспечение уведомляет о создании и / или изменении папок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...