Пул приложений IIS / перезапуск и ASP.NET - PullRequest
12 голосов
/ 12 марта 2012

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

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

Существует ли способ настроить IIS для запуска процесса в фоновом режиме и, как только он будет готов, переключиться из старого состоянияв новое, не влияя на пользователей?!

Заранее спасибо за ваш отзыв!

Ответы [ 2 ]

26 голосов
/ 12 марта 2012

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

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

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

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

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

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

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

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

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

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

К сожалению, модуль разогрева был прекращен для 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:

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

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

5 голосов
/ 12 марта 2012

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

При развертывании нового приложения ASP.NET это «домен приложения» сайта внутри , рабочий процесс разрушен, а не процесс пула.

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

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

Именно поэтому в ASP.NET есть специальная страница App_Offline.htm. Она есть, чтобы вы могли включить эту страницу, развернуть и затем отключить ее.

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

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

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

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

По связанным вопросам смотрите:

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

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

Возможно ли плавное развертывание с компонентными приложениями ASP.NET MVC?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...