Hay varias formas de manejar lo que está pidiendo, y algunos aspectos diferentes a su pregunta:
Maneje pequeñas actualizaciones para promociones
Lo que realmente está buscando aquí es un sistema de administración de contenido o similar que le permita editar el contenido sobre la marcha (piense en Wordpress / Drupal o desde un punto de vista de .NET N2 CMS, Umbraco, Orchard, etc.), sin embargo allí Hay algunas cosas que podrías probar si no has seguido esa ruta.
Debido a que ASP.NET solo se recarga realmente si toca ciertos tipos de archivos (web.config (s), el contenido de las carpetas /bin/
y en /app_code/
su mayoría) y tiene un límite configurable para "otros cambios de archivos" (básicamente, una vez que lo ha modificado) muchos archivos dentro de su sitio el grupo de aplicaciones se reiniciará - NumRecompilesBeforeAppRestart
) podría hacer algo en lo que verifica una carpeta diferente para algunos .html
archivos estáticos (es decir ) que extrae y muestra según sea necesario, o utilice el LoadControl
método que toma una ruta de cadena para un .ascx
control de usuario y lo carga dinámicamente: cómo determinar qué mostrar es una pregunta diferente más adecuada para StackOverflow; sin embargo, recomendaría una solución basada en convenciones de nomenclatura.
También podría considerar el uso de algo como el Marco de Extensibilidad Administrada (MEF, que ha sido una parte completa del marco .NET desde la versión 4) que le permite escribir una arquitectura basada en complementos y especificar una carpeta fuera de su /bin/
directorio para monitorear nuevos .DLL: aunque no lo he intentado para ver si evitará el problema de reinicio de la aplicación, lo he usado con buenos resultados en un entorno web para agregar funcionalidad común a un sitio.
Si eso no resulta atractivo, la única otra opción que se me ocurre sería agregar los controles como "código frontal" como lo hicimos en ASP clásico, es decir, con un <script runat="server">
bloque en lugar de una clase compilada "código subyacente" que contiene la lógica para ejecutar el control: esto eliminará la necesidad de un cambio de DLL, a expensas de alguna pérdida de rendimiento por primera vez a medida que el control se compila sobre la marcha, nuevamente deberá equilibrar esto con el NumRecompilesBeforeAppRestart
si Estás haciendo muchos pequeños cambios.
¿Cómo persisto las sesiones en los reinicios de la aplicación?
Este es posiblemente un problema más fácil de resolver e implica tres pasos clave:
- Configure MachineKey (IIS7, pero aún se mantiene para 8) para que sea un valor constante en lugar de
AutoGenerate
- esto significa que cuando AppPool recicle utilizará la misma clave, y así podrá descifrar las cookies de sesión, viewstate, etc. de antes El reciclaje.
- O bien configurar un servidor de estado o configurar una base de datos para mantener el estado de sesión .
- Cambiar el uso
InProc
de StateServer
o SQLServer
en el elemento SessionState en su web.config.
De esta manera, tendrá sesiones persistentes que sobrevivirán al reinicio de una aplicación. Sin embargo, estos no son "gratuitos": todo lo que almacene en la sesión ahora debe ser serializable, e incurrirá en un ligero impacto en el rendimiento ya que cada carga de la página ahora requerirá viajes de red adicionales para obtener y potencialmente liberar los datos de la sesión.
Sin embargo, si se encuentra en una posición en la que la aplicación tarda "varios minutos" en reiniciarse después de una implementación, es posible que desee considerar la posibilidad de pasar a un entorno de carga equilibrada o, al menos, a una configuración por etapas / en vivo intercambiable en caliente (como el proporcionado por Azure / AWS / etc.): de esta manera, puede desconectar un servidor mientras lo actualiza o prepararlo con el nuevo código y luego intercambiarlo, siempre que haya tomado los pasos para abordar sesiones (ver arriba) esto funcionará bien sin impacto para sus usuarios.