Обновление.ЧИСТЫЙ веб-сайт без перезагрузки


Раньше я разрабатывал веб-сайты в PHP и ASP classic, и если что-то нужно было изменить. Вы могли бы просто изменить один/несколько файлов, и никто бы этого не заметил. Возможно, если бы кто-нибудь запросил измененный файл во время загрузки, но это примерно полсекунды. Для большинства небольших сайтов это не проблема.

Но последние сайты построены с C# MVC и когда вы вносите изменения в код, вам нужно перестроить свой веб-сайт и загрузить измененный DLL файлы. Но когда вы измените свои файлы DLL, он перезапустит ваш веб-сайт и сбросит все активные файлы sessions. Он также должен все перезагрузить, а на больших сайтах загрузка всего может занять несколько минут. Все, кто просматривал сайт, заметят это и должны будут снова войти в систему.

Крупные обновления сайта не так уж распространены, так что это не проблема. Но у нас есть регулярные "небольшие" обновления для рекламных акций. Например, "Заполните эту форму и получите бесплатное членство на три месяца" или "Первые 10 до загрузите изображение... получит определенную цену". Я думаю, вы поймете, к чему я клоню. Некоторые рекламные акции похожи и могут быть обработаны с помощью модуля, который показывает правильную информацию на основе настроек, но довольно часто для этого требуется пользовательский код.

Я думал о системе, в которой каждая акция является собственным DLL файлом на основе интерфейса, а затем загружает DLL динамически, используя Type.GetType, Activator.CreateInstance и InvokeMember. Хотя это может сработать, мне интересно, правильный ли это путь.

Итак, мой вопрос: Как обновить сайт .NET на лету, без перезагрузки всего сайта и удаления сеанса (например, перезапуска пула приложений).

Author: Hugo Delsing, 2015-02-18

2 answers

Загляните в раздел "Инициализация приложения" IIS 7.5, Windows 2008 R2 (сложнее настроить) IIS 8, Windows 2012

Инициализация приложения позволяет любому приложению (пул приложений, а не сайт) перезапускаться с перекрытием и использовать старое, все еще работающее предыдущее приложение при запуске нового приложения. Как только новое приложение будет запущено (определяется URL-адресами, которые вы можете установить), оно начнет использовать новое приложение и завершит работу предыдущего. Использование Приложения Инициализация в сочетании с методами обеспечения сохранения сеанса при перезапуске пула приложений может позволить вашему сайту легко перезагрузиться. (У Жафа есть хорошая заметка о ключе машины.)

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

Вы можете настроить службы IIS таким образом, чтобы Обновление библиотеки DLL не вызывает немедленного перезапуска сайта и не изменяет web.config (высокие значения изменений в файлах HttpRuntime и внешних конфигурациях, в зависимости от вашего сайта).

Конечным результатом является то, что вы можете обновить библиотеки DLL/код без перезапуска сайта, а затем принудительно перезапустить приложение , которое будет использовать фоновый прогрев приложения для плавного изменения кода.

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

 11
Author: jeffreypriebe, 2018-06-28 04:04:28

Существует несколько способов справиться с тем, о чем вы просите, и несколько различных аспектов вашего вопроса:

Обрабатывайте небольшие обновления для рекламных акций

Что вам действительно нужно, так это система управления контентом или аналогичная, которая позволяет вам редактировать контент на лету (подумайте о Wordpress/Drupal или с точки зрения .NET, N2 CMS, Umbraco, Orchard и т. Д.), Однако есть некоторые вещи, которые вы могли бы попробовать, если вы еще не сделали этого маршрут.

Потому что ASP.NET только действительно перезагружается, если вы касаетесь определенных типов файлов (в основном файлов web.config, содержимого папок /bin/ и /app_code/) - и имеет настраиваемый предел для "других изменений файлов" (в основном, как только вы изменили так много файлов на своем сайте, пул приложений перезапустится - NumRecompilesBeforeAppRestart) вы могли бы подумать о том, чтобы сделать что-то, где вы проверяете другую папку на наличие некоторых статических (т. Е. .html) файлов, которые вы извлекаете и отображаете по мере необходимости, или используете LoadControl метод, который использует строковый путь к пользовательскому элементу управления .ascx и динамически загружает его - как вы определяете, что показывать, - это другой вопрос, более подходящий для StackOverflow, однако я бы рекомендовал решение, основанное на соглашении об именах.

Вы также могли бы рассмотреть возможность использования чего-то вроде Платформы управляемой расширяемости (MEF - которая была полной частью.NET framework начиная с версии 4), которая позволяет вам писать архитектуру на основе плагинов и указывать папку за пределами ваш каталог /bin/ для отслеживания новых .DLL - хотя я не пробовал это, чтобы проверить, позволит ли это избежать проблемы с перезапуском приложения, я использовал это с хорошим эффектом в веб-среде для добавления общих функций на сайт.

Если это не понравится, единственным другим вариантом, о котором я могу подумать, было бы добавить элементы управления как "код спереди", как мы делали в классическом ASP, т.Е. с блоком <script runat="server"> вместо скомпилированного класса "код сзади", который содержит логику для запуска элемента управления - это удалит необходимость изменения библиотеки DLL за счет некоторой потери производительности в первый раз, поскольку элемент управления компилируется на лету - опять же, вам нужно будет сбалансировать это с NumRecompilesBeforeAppRestart, если вы делаете много небольших изменений.

Как сохранить сеансы при перезапуске приложения?

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

  1. Настройте machineKey (IIS7, но все еще сохраняется для 8) как постоянное значение, а не AutoGenerate - это означает, что при повторной загрузке AppPool будет использовать тот же ключ, и поэтому он сможет расшифровывать файлы cookie сеанса, состояние просмотра и т. Д. До повторной загрузки.
  2. Либо настройте сервер состояний , либо настройте базу данных для сохранения состояния сеанса.
  3. Переключитесь с использования InProc на StateServer или SQLServer в элементе SessionState в вашем web.config.

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

Однако, если вы находитесь в положении, когда для перезапуска приложения после развертывания требуется "несколько минут", вы можете рассмотреть возможность перехода в среду с балансировкой нагрузки или, по крайней мере, в промежуточную/оперативную настройку с возможностью горячей замены (например, предоставляемую Azure/AWS/и т. Д.). - таким образом, вы можете перевести сервер в автономный режим, пока вы его обновляете или готовите с помощью нового кода, а затем поменять его местами - при условии, что вы предприняли шаги для решения общих сеансов (см. Выше), это будет работать нормально без влияния на ваших пользователей.

 5
Author: Zhaph - Ben Duguid, 2015-02-20 17:51:21