Есть несколько способов справиться с тем, что вы просите, и несколько разных аспектов вашего вопроса:
Обрабатывать небольшие обновления для рекламных акций
Что вам действительно нужно, так это система управления контентом или аналогичная, которая позволяет редактировать контент на лету (например, Wordpress / Drupal или с точки зрения .NET N2 CMS, Umbraco, Orchard и т. Д.), Однако есть некоторые вещи, которые вы могли бы попробовать, если вы не пошли по этому пути.
Поскольку ASP.NET действительно перезагружается, только если вы касаетесь файлов определенных типов (в основном, web.config (s), содержимого папок /bin/
и /app_code/
) и имеет настраиваемое ограничение для «других изменений файла» (в основном, после того, как вы изменили во многих файлах на вашем сайте пул приложений будет перезапущен - NumRecompilesBeforeAppRestart
) вы можете посмотреть что-то, где вы проверяете другую папку на наличие статических (то есть .html
) файлов, которые вы извлекаете и отображаете по мере необходимости, или используете LoadControl
метод, который принимает строковый путь к .ascx
управления пользователя и динамически загружает его - как вы определяете для показа другой вопрос больше подходит для StackOverflow - однако я рекомендовал бы решение на основе именования конвенции.
Вы также можете использовать что-то вроде платформы Managed Extensibility Framework (MEF - которая была полной частью .NET Framework начиная с версии 4), которая позволяет вам писать архитектуру на основе плагинов и указывать папку за пределами вашего /bin/
каталога для мониторинга. новые .DLLs - хотя я не пробовал этого, чтобы увидеть, удастся ли избежать проблемы с перезапуском приложения, я использовал это для хорошего эффекта в веб-среде для добавления общих функций на сайт.
Если это не подходит, единственная другая опция, о которой я могу подумать, это добавить элементы управления как «код впереди», как мы это делали в классическом ASP - то есть с <script runat="server">
блоком вместо скомпилированного класса «код позади» который содержит логику для запуска управления - это устранит необходимость в изменении DLL, за счет некоторой потери производительности первого времени , как элемент управления составлен на лету - опять вам нужно , чтобы сбалансировать это с NumRecompilesBeforeAppRestart
если вы Вы делаете много маленьких изменений.
Как сохранить сеансы при перезапуске приложения?
Возможно, этот вопрос легче решить и включает три ключевых шага:
- Сконфигурируйте MachineKey (IIS7, но по-прежнему имеет значение 8), чтобы он был постоянным значением, а не
AutoGenerate
- это означает, что при перезапуске AppPool он будет использовать тот же ключ и, таким образом, сможет дешифровать куки сеанса, представление состояния и т. Д. До переработка.
- Либо настройте сервер состояний, либо настройте базу данных для хранения состояния сеанса .
- Переключитесь с использования
InProc
на StateServer
или SQLServer
в элементе SessionState в вашем web.config.
Таким образом, у вас будут постоянные сеансы, которые переживут перезапуск приложения. Однако они не являются «бесплатными» - все, что вы храните в сеансе, теперь должно быть сериализуемым, и вы будете подвергаться небольшому снижению производительности, поскольку при каждой загрузке страницы теперь потребуются дополнительные сетевые поездки для получения и, возможно, освобождения данных сеанса.
Тем не менее, если вы находитесь в положении, в котором «перезапуск приложения после развертывания занимает« несколько минут », вы можете рассмотреть возможность перехода в среду с балансировкой нагрузки или, по крайней мере, горячую замену« Staging / Live ». (например, предоставляемый Azure / AWS / и т. д.) - таким образом вы можете отключить сервер во время его обновления или подготовить его с новым кодом, а затем заменить его - при условии, что вы предприняли шаги для решения проблемы общего доступа сеансы (см. выше), это будет работать нормально, без последствий для ваших пользователей.