Как сохранить сборки ASP.NET в AppDomain живыми? - PullRequest
50 голосов
/ 08 мая 2009

Сценарий: У меня есть корпоративное приложение ASP.NET n-уровня, развернутое с использованием проектов веб-развертывания. Все уровни производят независимые сборки, используемые приложением ASP.NET.

Проблема: Когда я запускаю приложение. в первый раз после развертывания загрузка в память зависимых сборок занимает много времени. Но однажды загрузилось его быстрое приложение освещения. Если у пользователя нет доступа к приложению, IIS выгружает сборки из памяти, а когда пользователь пытается получить доступ к приложению на более позднем этапе, он снова загружает все сборки, тратя на это столько же времени требуется для этого в первый раз.

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

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

Ответы [ 3 ]

72 голосов
/ 08 мая 2009

В IIS 6 перейдите в раздел Пулы приложений и щелкните правой кнопкой мыши> Свойства в пуле, в котором размещается рассматриваемое приложение ASP.NET. Перейдите на вкладку «Производительность» и снимите флажок «Завершать рабочие процессы после простоя:»

В IIS 7 перейдите на панель «Подключения», найдите пулы приложений и выберите «Дополнительные параметры» для пула, в котором размещается ваше приложение. Найдите свойство «Idle Timeout» и установите для него «0» (это отключает его).

По умолчанию 20 минут бездействия. Если снять флажок, когда ваш AppDomain будет загружен рабочим процессом , он никогда не умрет (если вы, конечно, не убьете процесс или что-то еще). По умолчанию IIS перезапускает процесс , когда он достигает некоторого предела, такого как ограничение памяти, но он также запускает новый и «фазирует» все входящие запросы, пока старый не будет использован, поэтому чтобы минимизировать нарушение.

Я также написал небольшой класс c #, который будет поддерживать ваше приложение ASP.NET живым ( альтернативная архивная версия ) при нормальных обстоятельствах. Поскольку он работает внутри приложения, очевидно, что он не может помешать IIS или чему-либо еще явно убить процесс, но он будет поддерживать приложение «горячим», например, приложение никогда не будет простаивать достаточно долго, чтобы IIS решил отключить его.

Если у вас нет прямого контроля над конфигурацией IIS (например, совместно используемым хостом), лучше всего иметь небольшое приложение, работающее в отдельной системе, например, постоянно включенной рабочей станции, которое будет попадать на ваш сайт каждый раз. минут, чтобы не допустить истечения срока действия пула приложений. Ничего особенного - подойдет простой WebRequest и цикл while () в консольном приложении.

3 голосов
/ 18 июля 2011

Одним из преимуществ ASP .net является возможность создания статических (общих) экземпляров объектов.

Чтобы избежать необходимости внешнего процесса, вы можете создать статический таймер в (на пример) global.asax, который вызывает страницу в домене с простым WebRequest. Таким образом, сайт сохраняет себя, пока не будет выполнен ручной сброс пула.

0 голосов
/ 03 марта 2010

Я написал небольшое консольное приложение на C #, которое поддерживает мои 4 сайта каждые 10 минут с помощью планировщика задач Windows. Жизнь снова хороша. Мы не запускаем приложение с 2-5 утра только для того, чтобы серванты могли делать любые очистки памяти, если это даже имеет значение. на наших сайтах редко кто-либо работает в эти часы.

...