Пул приложений IIS/перезагрузка и ASP.NET

Мы используем IIS7 для размещения веб-приложения asp.net. В этой среде администраторы и разработчики могут регулярно внедрять код в приложение.

Новый код или приложение идет как DLL в папку bin ASP.NET. После развертывания новой DLL IIS перезапускает процесс, влияя (замедляя) всех онлайн-пользователей.

Есть ли способ настроить IIS для запуска процесса в фоновом режиме и как только вы сделаете переход из старого состояния в новое без воздействия на пользователей?!

Заранее благодарим за отзыв!

Ответ 1

IIS уже делает это, что касается утилизации. ИТ-загрузка DLL, когда старая версия приложения все еще запущена. только после этого завершение утилизации завершается.

Однако загрузка DLL - это только часть готовых веб-приложений, также могут быть начальные нагрузки, такие как загрузка/кэширование пользователя db и т.д.
Эти действия не являются частью процесса рециркуляции, они происходят после перезагрузки DLL и завершения утилизации.

A назад я столкнулся с этой проблемой с приложением, у которого было огромное время запуска из-за тяжелой активности/кэширования db во время запуска. Поэтому мне было интересно, есть ли какая-то функциональность, которая позволяет нам выполнять код до того, как рециркуляция будет отмечена как завершенная, так что приложение будет считаться переработанным, когда все будет готово к запуску. В основном то, что я хотел, это какая-то промежуточная функциональность.
Я был в контакте с командой IIS по этой проблеме, к сожалению они сказали мне, что такой функциональности нет и не планируется.

Чтобы решить эту проблему, вы можете попробовать сделать следующее:

  • Использование альтернативных развертываний:
    Вы настраиваете 2 веб-сайта с отдельными пулами приложений. Одним из них является веб-сайт LIVE, другой - веб-сайт STAGED. Если вы хотите развернуть изменения, вы просто развертываете их на веб-сайте STAGED. После того, как все загружено/кэшировано и т.д., Вы переключаете параметры URL-адресов веб-приложений, чтобы перенаправить входящие запросы из LIVE в STAGED. Таким образом, LIVE становится новым STAGED и наоборот. Затем следующее развертывание перейдет к новому STAGED и так далее.

UPDATE
По-видимому, они создали модуль IIS, который теперь предоставляет эту функциональность:

Модуль прогрева приложений IIS для IIS 7.5

Команда IIS выпустила первую бета-версию Модуль разминирования приложений для IIS 7.5. Это приводит к приложений даже проще, чем описано ранее. Вместо написания пользовательский код, вы указываете URL-адреса ресурсов для выполнения перед Веб-приложение принимает запросы из сети. Это разминка происходит во время запуска службы IIS (если вы настроили IIS пул приложений как AlwaysRunning) и когда рабочий процесс IIS перерабатывает. Во время утилизации старый рабочий процесс IIS продолжает выполнять запросы до тех пор, пока процесс нового порожденного рабочего не будет полностью прогреваются, так что приложения не будут прерываться или проблемы из-за немаркированных кешей. Обратите внимание, что этот модуль работает с любыми версия ASP.NET, начиная с версии 2.0.

Дополнительные сведения см. в разделе "Разогрев приложений" на веб-сайте IIS.net. Для прохода, в котором показано, как использовать функцию разминки, см. Начало работы с модулем разминирования приложений IIS 7.5 на Веб-сайт IIS.net.

Смотрите:

http://www.asp.net/whitepapers/aspnet4

Если вы используете функцию автоматического запуска ASP.NET 4:

Вы все же можете выбрать автоматическую переработку рабочих процессов со времени до время. Когда вы это сделаете, приложение немедленно перезапустится и ваш код разминки будет выполнен (в отличие от сегодняшнего дня, когда вам нужно подождать для следующего запроса - сделать это).

Основное различие между функцией Warm Up и Auto Start заключается в том, что модуль Warm Up является частью процесса рециркуляции. Вместо того, чтобы блокировать приложение для запросов, при запуске кода инициализации.
Единственное, что вы получаете с помощью функции автоматического запуска, - это то, что вам не нужно ждать, пока пользователь нажмет на страницу, что не поможет вашему делу.

См. сообщение в блоге Гу:

http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx

ОБНОВЛЕНИЕ 2:

К сожалению, модуль Warmup был отключен для IIS 7/7.5:

http://forums.iis.net/t/1176740.aspx

Он будет частью IIS8 (теперь он называется Модуль инициализации приложения):

http://weblogs.asp.net/owscott/archive/2012/03/01/what-s-new-in-iis-8.aspx

ОБНОВЛЕНИЕ 3:

Как указано в комментариях, модуль Warmup обновился для IIS 7.5 в качестве модуля инициализации приложения для IIS 7.5 после выхода IIS 8:

http://www.iis.net/downloads/microsoft/application-initialization

Ответ 2

Первая часть ntziolis answer является нечеткой. Рабочий процесс не перерабатывается или перезапускается, он просто продолжает работать. Если бы это было так, то в средах с общим пулом вы были бы выбиты местами каждый раз, когда новый был развернут.

При развертывании нового приложения ASP.NET сайт "Application Domain" в рабочем процессе срывается, а не пул.

Кроме того, утилизация пула - это совершенно отдельная концепция развертывания

В этот момент времени в коммерческой жизни ASP.NET во время развертывания сайт будет находиться в противоречивом состоянии до тех пор, пока не будет развернут весь сайт. По-прежнему нет хорошей истории об этом от Microsoft в настоящее время для одного сайта при развертывании на одном сервере.

Вот почему ASP.NET имеет специальную App_Offline.htm страницу. Там вы можете включить эту страницу, развернуть, а затем отключить ее.

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

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

Очевидно, что если имеется большой объем созданного пользователем контента (загруженные файлы и т.п.), вы сопоставляете виртуальный каталог на своем сайте с общим местоположением для этих данных.

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

По смежным вопросам см.:

Как развернуть приложение в IIS во время работы этого веб-приложения

Публикация/загрузка новой DLL в IIS: веб-сайт идет вниз при загрузке

Возможно ли плавное развертывание с помощью компонентных приложений ASP.NET MVC?