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

При загрузке новой библиотеки DLL для большого веб-приложения (dll составляет около 1 МБ) IIS выдает ошибку, поскольку библиотека DLL «используется», то есть веб-сайт не работает во время загрузки DLL. Есть ли способ остановить это поведение?

Кроме того, хотя я использую веб-приложения, а не веб-сайты, всякий раз, когда я загружаю новую DLL, перезапуск IIS после новой загрузки все равно занимает некоторое время. Я думал, что это ожидание, как правило, только для веб-сайтов, поскольку они должны компилироваться IIS, а не веб-приложениями?

Ответы [ 2 ]

2 голосов
/ 04 марта 2013

Вы можете использовать AAR вместе с некоторыми сценариями Powershell для развертывания с нулевым временем простоя на одном компьютере.

В основном вы настроили 3 сайта.Один слушает запросы, передавая их в ARR, который перенаправляет их на один из двух других сайтов.Одновременно активен только один из этих 2 сайтов.

При развертывании вы копируете новые файлы на остановленный сайт, прогреваете его, а затем приказываете ARR начать пересылку запросов на этот узел, после чегоВы можете перевести сайт со старым кодом в автономный режим.

Этот скрипт в значительной степени автоматизирует этот процесс.Предполагается следующая структура файла / сайта / веб-фермы:

Файл Strcuture

  • C: \ PATH_TO_YOUR_CODE \ $ projectName (эта папка содержит файлы, которые будут развернуты)
  • C: \ PATH_TO_YOUR_CODE \ $ projectName-Green (может быть пустым для начала - файлы активации будут скопированы здесь при активации этого узла)
  • C: \ PATH_TO_YOUR_CODE \ $ projectName-Blue (может быть пустым для запускаwith - файлы развертывания будут скопированы сюда при активации этого узла)

Сайты IIS

  • "$ projectName" (Сайт ARR) Запуск
  • "$projectName-Green "(сбалансированный зеленый сайт) остановлен
  • " $ projectName-Blue "(сбалансированный синий сайт) остановлен

веб-фермы

  • " $projectName-Farm "
  • " $ deployBlueNodeAddress "Недоступно
  • " $ deployGreenNodeAddress "Недоступно
1 голос
/ 15 января 2011

Как только вы сделаете такое изменение, вы фактически изменили зависимость. Сайт необходимо будет перекомпилировать в папки теневого копирования ASP.NET.

Обновление:

Исходя из вашего комментария: Что, если кто-то покупает и товар на сайте электронной коммерции в то же время новые обновления были выпущены? Это одна из моих ошибок .NET (одна вещь, которую мне не хватает в php, - это простая загрузка файлов PHP без хлопот)

Если у вас есть только один сервер, вам нужно спланировать свои обновления и заранее предупредить, что сайт будет недоступен из-за обновления. В ASP.NET есть функция под названием App_Offline.htm. Это специальная страница, которая, когда она присутствует в вашем приложении, заставляет ASP.NET отображать ее содержимое независимо от того, какая страница запрашивается. Вы можете использовать это для отображения сообщения, объясняющего пользователям, что сайт отключен для обслуживания. Вы можете прочитать больше об этом здесь в блоге Скотта Гатри .

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

Вы упоминаете, что в PHP у вас не было бы этой проблемы. На самом деле, если вы обновляете что-то большее, чем пару не связанных страниц, вы должны запретить пользователям доступ к сайту во время обновлений в качестве курса.

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

  1. Страница обратной передачи новая и все еще находится в очереди на загрузку. Это нарушает вновь загруженный скрипт, потому что когда пользователь нажимает кнопку «Отправить», ему нечего отправлять.

  2. Страница обратной передачи уже существует, но не была обновлена. Эта страница записывает поля записей формы в базу данных. Вы добавили это новое поле в базу данных, но оно является обязательным и не может быть пустым. Ваш еще не обновленный сценарий обратной передачи пытается обновить БД, но возникает ошибка, поскольку новое поле отсутствует в операторе INSERT формы обратной передачи и, следовательно, является нулевым, что вызывает нарушение ограничения NOT NULL.

Я мог бы продолжить. Если ваш сайт предоставляет больше, чем просто тривиальное количество функциональных возможностей, вы должны перейти в автономный режим для ВСЕХ обновлений, чтобы убедиться, что ВСЕ обновленный код развернут в одном атомарном обновлении.

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