Оновіть веб-сайт .NET без перезавантаження


13

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

Але останні сайти створюються, C# MVCі коли ви вносите зміни до коду, вам потрібно відновити веб-сайт та завантажити змінені DLLфайли. Але коли ви зміните свої DLLфайли, він перезапустить ваш веб-сайт і скине всі активні sessions. Він також повинен перезавантажити все, і для великих сайтів може знадобитися кілька хвилин, щоб завантажити все. Усі, хто переглядав сайт, помітять і потрібно знову увійти.

Основні оновлення сайтів не так часто, тому це не проблема. Але у нас є регулярні "невеликі" оновлення для акцій. Як-от "Заповніть цю форму і отримайте три місяці безкоштовного членства" або "Перші 10, щоб завантажити зображення ... отримаєте ціну". Я думаю, ви отримаєте дрейф. Деякі акції схожі, і їх можна обробляти за допомогою модуля, який відображає правильну інформацію на основі налаштувань, але досить часто для цього потрібен спеціальний код.

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

Отже, моє запитання: як ви оновлюєте .NETсайт на ходу, не перезавантажуючи весь сайт і не припиняючи сеанс (наприклад, переробляти пул додатків).


У відповідь на ваш коментар з великим рахунком: великі веб-сайти, над якими я працюю, обробляють невеликі зміни коду так само, як вони обробляють великі зміни в коді: через балансири навантажень і поза сесійними процесами - адже весь код, який розгорнуто для проживання, повинен пройти процес огляду / виходу, і ми не можемо просто скинути код на сервери. Гадаю, наші визначення "великого" можуть не збігатися;)
Джаф - Бен Дюгід

Відповіді:


11

Перегляньте "Ініціалізація додатків" IIS 7.5, Windows 2008 R2 (складніше в налаштуванні) IIS 8, Windows 2012

Ініціалізація додатків дозволяє будь-якій програмі (пул додатків не на сайті) перезапуститись, щоб перекриватись та використовувати стару, все ще запущену попередню програму під час прогрівання запуску нової програми. Після запуску нової програми (визначається URL-адресами, які ви можете встановити), вона почне використовувати нову програму та вимикає попередню. Використання ініціалізації додатків у поєднанні з методами, які забезпечують збереження сеансу в ході перезапуску пулу додатків, дозволять вашому сайту легко перезавантажуватися. (Джаф добре позначив ключ машини.)

На додаток до перерахованих вище посилань для конфігурації ініціалізації додатків, ви хочете переглянути, що викликає перезавантаження сайту - оскільки перезапуск сайту не використовує ініціалізацію додатків, перезапуск сайту не буде безпроблемним.

Ви можете налаштувати IIS так, що оновлення DLL не одразу викликає перезавантаження сайту, а також не змінить web.config (високі значення ChangeNotification в httpRuntime та зовнішніх файлах конфігурації, що стосуються вашого сайту).

Кінцевим результатом є те, що ви можете оновити DLL / код без перезавантаження сайту, а потім змусити перезапустити програму, яка використовуватиме прогрівання фону AppInitialization для безперебійної зміни коду.

Виконувати ці речі на концертних роботах досить добре для безперервного перезавантаження.


Хороший набір кроків - звичайно, що варто врахувати :)
Джаф - Бен Дюгід

Це звучить як те, що я шукав. Збираюся спробувати його і налаштувати. Дякую
Х'юго Делсінг

@HugoDelsing Сподіваюся, що це чудово працює для вас.
jeffreypriebe

Дякую, це те, що я закінчив, і це чудово працює.
Гюго Делсінг

@HugoDelsing Радий почути, що це працює і для вас.
jeffreypriebe

5

Існує декілька способів вирішити те, що ви просите, і кілька різних аспектів вашого питання:

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

Те, про що ви дійсно хочете тут, - це система управління вмістом чи подібне, що дозволяє вам редагувати вміст на ходу (думайте, Wordpress / Drupal або з точки зору .NET N2 CMS, Umbraco, Orchard тощо), однак там є кілька речей, які ви могли б спробувати, якщо ви не пішли по цьому маршруту.

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

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

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

Як я можу зберігати сеанси через перезавантаження програми?

Це, можливо, простіше вирішити і включає три ключові кроки:

  1. Налаштування MachineKey (IIS7, але все ще має місце для 8) є постійним значенням, а не AutoGenerate- це означає, що, коли AppPool переробляє, він буде використовувати той самий ключ, і таким чином зможе розшифрувати файли cookie сеансу, viewstate тощо тощо раніше переробляти.
  2. Або встановіть сервер стану або налаштуйте базу даних для утримання стану сеансу .
  3. Переключіться з використання InProcна елемент SessionState StateServerабо SQLServerна його веб-конфіг.

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

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


Дякую за довгу відповідь. На жаль, це CMSне те, що я хочу. Я не хочу змінювати вміст, я хочу змінити код. Частина про сеанси була лише прикладом. Змінивши це, це не вирішить проблему того, що сайт перебуває на хвилині чи дві під час перезавантаження DLLфайлів. MEFЧастина була цікавою, але це рішення третьої сторони системи я думав о. Тож +1 за зусилля, але, на жаль, це насправді не відповідь на моє запитання.
Гюго Делсінг

1
Я оновив свою відповідь, щоб вирішити декілька таких моментів: MEF був випущений MS і був повноцінною частиною .NET рамки з v4. Ви можете спробувати використати код для перегляду для своїх нових елементів керування, або прийняти налаштування, збалансоване завантаженням / інсценізацією, в режимі реального часу, яке дасть змогу запустити і запустити сервер, а потім поміняти його.
Zhaph - Ben Duguid

1
Я окреслив альтернативне рішення, використовуючи ініціалізацію додатків. Перевага полягає в тому, що всі налаштування коду та сервера є "нормальними" без спеціального регулювання навантаження або динамічного завантаження, що полегшує робоче середовище. Звичайно, налаштування балансування навантаження / інсценізація в прямому ефірі може бути корисною з інших причин.
jeffreypriebe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.