Бесшовное развертывание в ASP.NET(IIS убивает рабочий процесс до того, как новый рабочий процесс готов)
Я пытаюсь развернуть веб-приложение .NET в IIS (7.5) без каких-либо проблем для пользователей. Я убедился в том, что Отключить переполненный цикл False, но я все равно сталкиваюсь с одной и той же проблемой каждый раз.
Каждый раз, когда я загружаю новые двоичные файлы для сайта, IIS убивает рабочий процесс, прежде чем он запустит новый. Поэтому каждый раз, когда я загружаю новых пользователей двоичных файлов, вы получаете это сообщение об ошибке:
Ошибка сервера в приложении "/". Мог не загружать файл или сборку "MyApplicationWeb" или один из его зависимостей. Процесс не может доступ к файлу, поскольку он используемый другим процессом. (Исключение от HRESULT: 0x80070020)
Я понятия не имею, как это сделать. Как сейчас, я просто загружаю двоичный файл; но в то время как загрузка происходит (или локальная копия), она будет выдавать приведенное выше поведение. Я также попытался использовать веб-сад, но с тем же результатом.
То, что я не ищу:
- Как решить проблему с внешними балансировщиками нагрузки (это функциональное решение, но это безупречное решение для нескольких серверов, и оно не будет работать вообще, если есть только один сервер).
- Как создать обход с обновлением на странице пользовательских ошибок (поскольку у него есть некоторые очевидные проблемы, но, что более важно, вообще не работает с веб-службами/ajax).
Я действительно думаю, что это должно быть выполнимым, если http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/24e3c22e-79a9-4f07-a407-dbd0e7f35432.mspx?mfr=true
Обновление:
В статье выше говорится:
Однако, поскольку тайм-аут выключения значение выключения или запуска настраиваемый, рабочий процесс может быть прекращенным, пока он все еще запросы на обслуживание, если они не заканчиваются обслуживания существующих запросов в рамках срок.
Я понятия не имею, где найти это значение и что он по умолчанию. Если его меньше, чем на несколько секунд, это может объяснить мои результаты.
пс. Я размещаю его на SO, а не на SF/Webmasters и т.д., Потому что я думаю, что такие знания, вероятно, будут минимальными среди людей, которые не активны в развитии, я надеюсь, что все в порядке.
Ответы
Ответ 1
При развертывании приложений ASP.Net я создаю новую папку на сервере и меняю домашний каталог веб-сайта в IIS. Это обеспечивает нулевое развертывание бездействия и быструю откатовую позицию в случае непредвиденных проблем. В будущем обновлении я откажусь от старой версии и повторю процесс, чтобы всегда была одна позиция отката.
Обновление - время отключения
Подробная информация о настройке предельного времени выключения для рабочих подробно описана в http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/processModel. Значение по умолчанию - 1 мин 30 с. Найдите раздел shutdownTimeLimit на связанной странице.
Обновление - Дополнительная информация
Подобный вопрос с отличным ответом
Суть в том, что из-за перезаписывания существующих файлов механизм копирования принимает исключительную блокировку файлов и что без возможности использования без использования app_offline.htm или механизма, такого как предлагалось выше, невозможно. Прочитайте связанный ответ, поскольку он переходит на гораздо более глубокую глубину.
Ответ 2
Я согласен с ответом Smirkin - обновляет вторую папку и меняет домашний каталог IIS, чтобы указать на другую папку. Другим преимуществом этого является то, что у вас есть простой путь отката (просто верните домашний каталог IIS).
Я написал сообщение с script о том, как это сделать, используя Powershell - надеюсь, что это поможет: http://davidduffett.net/post/4833657659/blue-green-deployment-to-iis-with-powershell
Вы можете использовать этот script непосредственно из вашей системы непрерывной интеграции.
Ответ 3
В то время как ответ Smirkin обеспечивает приятный бесшовный способ для администратора развернуть сайт с небольшим временем простоя или без него и должен решить вашу проблему с отсутствующими сборками/ссылками, если вы нарушаете изменения в своей базе кода (т.е. удаляете старые страницы, изменяете формы и т.д.), тогда использование этого метода может по-прежнему приводить к некоторым "хлопотам" для всех пользователей, которые запускают процесс перед коммутатором и завершают его после (т.е. они запрашивают страницу перед ее переключением, начинают заполнять ее, а затем отправляют страницу после перехода в новый каталог).
Я знаю, что вы не хотите, чтобы я это говорил, но без балансировки нагрузки с включенными липкими сессиями вы не сможете позволить людям продолжать использовать старую версию сайта до тех пор, пока они не закончат при обработке новых сеансов в новой версии - путем изменения домашнего каталога приложения IIS выполнит повторную компиляцию приложения и перезапустит процессы. Таким образом, вы можете установить, чтобы старый сервер продолжал обслуживать свои текущие подключения, но сообщите балансу нагрузки, чтобы не отправлять какие-либо новые подключения к нему.
Однако есть еще один шаг, который вы можете предпринять, чтобы помочь смягчить часто возникающие проблемы:
Настроить MachineKey как константное значение, а не AutoGenerate
- это означает, что когда AppPool перерабатывает, он будет использовать один и тот же ключ и, таким образом, сможет расшифровывать файлы cookie сеансов, viewstate и т.д.
Ответ 4
Я предполагаю, что у вас есть антивирусный сканер или какой-то другой процесс индексирования, который блокирует файл, как только вы его скопируете.
Ответ 5
вы можете использовать app_offline.htm
это решение не является бесшовным, но вы можете использовать
<meta http-equiv="refresh" content="5" />
в файле htm, поэтому браузер автоматически обновляет без javascript.
приветствия