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

Как сохранить сборки ASP.NET в AppDomain в живых?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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