Беспроблемное развертывание в ASP.NET (IIS убивает рабочий процесс до того, как новый рабочий процесс будет готов) - PullRequest
13 голосов
/ 19 марта 2011

Я пытаюсь развернуть веб-приложение .NET в IIS (7.5) без каких-либо хлопот для пользователей.Я удостоверился, что Disable Overlapped Recycle имеет значение 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 и т. Д., Потому что я думаю, что такого рода знания, вероятно, будут минимальными среди людей, которые не занимаются разработкой, я надеюсь, что все в порядке.

Ответы [ 5 ]

17 голосов
/ 19 марта 2011

При развертывании приложений ASP.Net я создаю новую папку на сервере и меняю домашний каталог веб-сайта в IIS.Это обеспечивает нулевое время простоя развертывания и быструю позицию отката в случае непредвиденных проблем.В будущем обновлении я удаляю старую версию и повторяю процесс так, чтобы всегда была одна позиция отката.

Обновление - ограничение времени выключения

Подробные сведения о настройке ограничения времени выключения для рабочихпри http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/processModel. По умолчанию 1 мин 30 с.Ищите раздел shutdownTimeLimit на связанной странице.

Обновление - дополнительная информация

Подобный вопрос с отличным ответом

Суть в том, чтоиз-за перезаписи существующих файлов механизм копирования берет на себя эксклюзивную блокировку файлов и невозможность развертывания без видимых причин без использования app_offline.htm или механизма, такого как предложенный выше.Прочитайте связанный ответ, поскольку он углубляется в глубину.

4 голосов
/ 22 апреля 2011

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

Я написал сообщение со сценарием о том, как сделать это с помощью Powershell - надеюсь, это поможет: http://davidduffett.net/post/4833657659/blue-green-deployment-to-iis-with-powershell

Вы должны иметь возможность использовать этот скрипт непосредственно из вашей системы непрерывной интеграции.

3 голосов
/ 22 марта 2011

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

Я знаю, что вы не хотите, чтобы я это говорил, но без балансировки нагрузки с включенными Sticky-Sessions вы не сможете позволить людям продолжать использовать старую версию сайта, пока они не закончат при обработке новых сеансов в новой версии - изменяя домашний каталог приложения, IIS выполнит перекомпиляцию приложения и перезапустит процессы. Таким образом, вы можете настроить старый сервер так, чтобы он продолжал обслуживать текущие соединения, но при этом указать баланс нагрузки, чтобы он не отправлял на него никаких новых соединений.

Тем не менее, есть еще один шаг, который вы можете предпринять, чтобы помочь смягчить проблемы, часто встречающиеся вокруг этого:

Настройте MachineKey как постоянное значение, а не AutoGenerate - это означает, что при перезапуске AppPool он будет использовать тот же ключ и, таким образом, сможет расшифровать сеанс куки, viewstate и т. д.

2 голосов
/ 19 марта 2011

Я предполагаю, что у вас есть антивирусный сканер или какой-то другой процесс индексации, который блокирует файл, как только вы копируете его туда.

0 голосов
/ 22 марта 2011

вы можете использовать app_offline.htm

это решение не является бесшовным, но вы можете использовать

<meta http-equiv="refresh" content="5" />

в файле htm, поэтому браузер автоматически обновляет его без JavaScript.

ура

...