Перезапуски ASP.NET, когда папка создается, переименовали или удалили

ОБНОВЛЕНИЕ - обрабатывает для тиражирования проблемы:

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 также.

Там какой-либо путь состоит в том, чтобы предотвратить это поведение?

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

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

17
задан frankadelic 25 February 2010 в 21:16
поделиться

3 ответа

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

15
ответ дан 30 November 2019 в 12:50
поделиться

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


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

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

0
ответ дан 30 November 2019 в 12:50
поделиться

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

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

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

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

2
ответ дан 30 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: