Il y a plusieurs façons de gérer ce que vous demandez et quelques aspects différents de votre question:
Gérez les petites mises à jour pour les promotions
Ce que vous recherchez vraiment ici, c'est un système de gestion de contenu ou similaire qui vous permet de modifier le contenu à la volée (pensez à Wordpress / Drupal ou d'un point de vue .NET N2 CMS, Umbraco, Orchard, etc.), mais là sont des choses que vous pourriez essayer si vous n'avez pas suivi cette voie.
Parce qu'ASP.NET ne se recharge vraiment que si vous touchez certains types de fichiers (web.config (s), le contenu des dossiers /bin/
et /app_code/
principalement) - et a une limite configurable pour «d'autres changements de fichiers» (essentiellement une fois que vous avez modifié afin de nombreux fichiers au sein de votre site, le pool d'applications redémarrera - NumRecompilesBeforeAppRestart
) vous pourriez envisager de faire quelque chose dans lequel vous recherchez dans un dossier différent des .html
fichiers statiques (c'est-à-dire ) que vous extrayez et affichez si nécessaire, ou utilisez la LoadControl
méthode qui prend un chemin de chaîne pour un .ascx
contrôle utilisateur et le charge dynamiquement - la façon dont vous déterminez lequel afficher est une question différente plus adaptée à StackOverflow - mais je recommanderais une solution basée sur une convention de dénomination.
Vous pouvez également envisager d'utiliser quelque chose comme le Managed Extensibility Framework (MEF - qui fait partie intégrante du .NET Framework depuis la version 4) qui vous permet d'écrire une architecture basée sur un plugin et de spécifier un dossier en dehors de votre /bin/
répertoire à surveiller. nouveaux .DLL - bien que je n'aie pas essayé cela pour voir si cela évitera le problème de redémarrage de l'application, je l'ai utilisé à bon escient dans un environnement Web pour ajouter des fonctionnalités communes à un site.
Si cela ne fait pas appel, la seule autre option à laquelle je peux penser serait d'ajouter les contrôles comme "code-in-front" comme nous l'avons fait dans ASP classique - c'est-à-dire avec un <script runat="server">
bloc au lieu d'une classe "code-behind" compilée qui contient la logique pour exécuter le contrôle - cela supprimera la nécessité d'un changement de DLL, au détriment de la première perte de performances lors de la compilation du contrôle à la volée - encore une fois, vous devrez équilibrer cela avec le NumRecompilesBeforeAppRestart
si vous fais beaucoup de petits changements.
Comment puis-je conserver des sessions lors des redémarrages de l'application?
Il s'agit probablement d'un problème plus facile à résoudre et qui comprend trois étapes clés:
- Configurer la MachineKey (IIS7, mais vaut toujours pour 8) pour être une valeur constante plutôt que
AutoGenerate
- cela signifie que lorsque l'AppPool recycle, il utilisera la même clé, et pourra ainsi décrypter les cookies de session, l'état d'affichage, etc. d'avant le recyclage.
- Soit configurer un serveur d' état ou configurer une base de données pour tenir l' état de session .
- Basculez de l'utilisation
InProc
vers StateServer
ou SQLServer
dans l'élément SessionState dans votre web.config.
De cette façon, vous aurez des sessions persistantes qui survivent au redémarrage d'une application. Cependant, ceux-ci ne sont pas "gratuits" - tout ce que vous stockez dans la session doit maintenant être sérialisable, et vous obtiendrez une légère baisse des performances car chaque chargement de page nécessitera désormais des trajets réseau supplémentaires pour obtenir, et potentiellement libérer les données de session.
Cependant, si vous êtes dans une position où il faut "plusieurs minutes" pour que l'application redémarre après un déploiement, vous voudrez peut-être envisager de passer à un environnement à charge équilibrée, ou au moins à une configuration Staging / Live remplaçable à chaud (tel que celui fourni par Azure / AWS / etc.) - De cette façon, vous pouvez mettre un serveur hors ligne pendant que vous le mettez à jour ou le préparer avec le nouveau code, puis échangez-le - à condition que vous ayez pris les mesures nécessaires pour résoudre le problème partagé sessions (voir ci-dessus), cela fonctionnera correctement sans impact sur vos utilisateurs.