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

Бесшовное развертывание в 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 и т.д., Потому что я думаю, что такие знания, вероятно, будут минимальными среди людей, которые не активны в развитии, я надеюсь, что все в порядке.

4b9b3361

Ответ 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.

приветствия