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

17

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) Запросить страницу в браузере Ссылка

запуск приложения

6) Создайте новую папку c: \ projects \ restart-demo \ asdf

конец приложения

7) Запросить страницу в браузере Ссылка

запуск приложения

8) Переименуйте папку c: \ projects \ restart-demo \ asdf в c: \ projects \ restart-demo \ asdf1

конец приложения

окончательное обновление

Мы используем встроенную CMS для создания файлов и папок на сайте ASP.NET.

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

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

  

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

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

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

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

  • Кэш удаляется при перезагрузке домена приложения
  • После перезагрузки домен приложения необходимо перезагрузить.
задан frankadelic 12.02.2010 в 01:28
источник
  • Это происходит в 100% случаев, или, когда говорят, определенное число создано, как и каждое 15-е изменение? –  Nick Craver♦ 12.02.2010 в 01:37
  • Поведение, которое вы описываете, не является типичным. Можете ли вы дать нам еще более подробный инфо-код? –  Nathan Taylor 12.02.2010 в 01:39
  • @Nick: Это происходит каждый раз. –  frankadelic 12.02.2010 в 01:47
  • @ Натан, я опубликовал шаги по воспроизведению проблемы. –  frankadelic 12.02.2010 в 05:24
  • Предполагая, что принятый ответ исправил вашу проблему. Можете ли вы сказать мне, где вы добавили код ниже и откуда вы его вызвали. Я пробовал делать это в файлах Global.asax и controlller без везения. Будет здорово, если вы сможете отредактировать свой вопрос и разместить эту информацию в конце :) –  TechnicalSmile 03.07.2015 в 14:10

5 ответов

15

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

    
ответ дан frankadelic 12.02.2010 в 18:25
источник
  • Похоже на огромный взлом, но если он работает, я думаю, у вас нет выбора. +1 для сообщения вашего решения. –  mxmissile 12.02.2010 в 22:23
  • Также есть более полный пример того, как это сделать здесь: aaronblake.co.uk/blog/2009/09/28/... –  Luke Sampson 16.03.2010 в 09:25
9

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

    
ответ дан Pleun 28.04.2011 в 18:04
источник
2

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

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

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

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

    
ответ дан Nick Craver 12.02.2010 в 01:42
источник
  • Ничто не перекомпилирует. Я просто создаю пустые папки. Кроме того, я изменил numRecompilesBeforeAppRestart, и Application_End по-прежнему срабатывает при каждом создании / изменении / удалении папки. –  frankadelic 12.02.2010 в 01:53
  • @frankadelic - Можете ли вы обновить пример нескольких создаваемых папок по отношению к корню? –  Nick Craver♦ 12.02.2010 в 02:01
  • Добавлены шаги для репликации проблемы. –  frankadelic 12.02.2010 в 02:08
  • @frankadelic - В какой ОС это видение? Функциональность FCN отличается, поэтому в этом случае имеет значение –  Nick Craver♦ 12.02.2010 в 02:16
  • Я реплицировал проблему в Windows XP (IIS 5.1) и Windows 2008 (IIS7). –  frankadelic 12.02.2010 в 02:24
2

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

    
ответ дан Bill Wade 16.11.2016 в 18:37
источник
0

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

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

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

    
ответ дан John Saunders 12.02.2010 в 01:40
источник
  • Сообщение о событии: приложение закрывается. Причина: Неизвестно. –  frankadelic 12.02.2010 в 02:07
  • Просто попробовал с проектом веб-приложений. Тот же вопрос. –  frankadelic 12.02.2010 в 02:45
  • Спасибо за проверку. В этом случае я предлагаю вам искать антивирусное программное обеспечение и, возможно, индексировать программное обеспечение. ASP.NET не вызывает перезапуска при создании папок - что-то еще. –  John Saunders 12.02.2010 в 02:50
  • Пробовал это на отдельной машине без антивирусного программного обеспечения, а служба индексирования отключена. Я все еще нахожу приложение Application_End. Я тестировал на трех отдельных машинах. –  frankadelic 12.02.2010 в 05:22
  • @Downvoter: скажите почему. –  John Saunders 12.02.2010 в 20:37