Існує декілька способів вирішити те, що ви просите, і кілька різних аспектів вашого питання:
Обробляйте невеликі оновлення для рекламних акцій
Те, про що ви дійсно хочете тут, - це система управління вмістом чи подібне, що дозволяє вам редагувати вміст на ходу (думайте, 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
якщо ви робиш багато невеликих змін.
Як я можу зберігати сеанси через перезавантаження програми?
Це, можливо, простіше вирішити і включає три ключові кроки:
- Налаштування MachineKey (IIS7, але все ще має місце для 8) є постійним значенням, а не
AutoGenerate
- це означає, що, коли AppPool переробляє, він буде використовувати той самий ключ, і таким чином зможе розшифрувати файли cookie сеансу, viewstate тощо тощо раніше переробляти.
- Або встановіть сервер стану або налаштуйте базу даних для утримання стану сеансу .
- Переключіться з використання
InProc
на елемент SessionState StateServer
або SQLServer
на його веб-конфіг.
Таким чином у вас будуть стійкі сеанси, які переживуть перезавантаження програми. Однак вони не є "безкоштовними" - все, що ви зберігаєте в сеансі, тепер має бути серіалізаційним, і ви зазнаєте невеликий показник продуктивності, оскільки кожне завантаження сторінки вимагатиме додаткових мережевих поїздок, а також потенційно звільнення даних сеансу.
Однак якщо ви перебуваєте в положенні, де потрібно кілька хвилин, щоб програма перезапустилася після розгортання, ви можете розглянути можливість переходу до середовища, збалансованого навантаженням, або, принаймні, налаштування інтерактивного режиму "Жива". (наприклад, наданий Azure / AWS / тощо.) - таким чином ви можете взяти сервер в автономному режимі під час оновлення або підготувати його з новим кодом, а потім поміняти його в обмін - за умови, що ви вжили заходів для вирішення спільного доступу сеанси (див. вище), це буде добре працювати, не впливаючи на користувачів.