Подтвердить что ты не робот

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.

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

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

  • Кэш удаляется при перезагрузке домена приложения
  • После перезагрузки домен приложения необходимо перезагрузить.
4b9b3361

Ответ 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 при изменении содержимого корневой папки веб-сайта.