2011-09-26 12 views
6

Para montajes regulares, se puede usar MEF para cargar ensamblajes dinámicamente. Si se requiere una actualización en tiempo real de esos ensamblados, la recomendación es usar AppDomains para alojar los ensamblados dinámicos (potencialmente se puede usar el Framework de Complemento Administrado (MAF)). Cuando se requiere una actualización, el dominio de aplicación se detiene, los conjuntos se actualizan y el dominio de aplicación se vuelve a cargar.Cómo agregar páginas web dinámicamente en ASP .NET (y actualizar el complemento)?

¿Qué pasa con los ensamblados cargados por ASP .NET que contienen ese código detrás de las clases? ¿Cómo puedo actualizarlos sin forzar un reinicio del dominio principal de la aplicación? ¿Es posible alojar algunas de mis páginas en un dominio dinámico? ¿Cómo lo harías tú? ¿Puede este dominio compartido compartir el token de inicio de sesión y la autenticación para que el usuario no tenga que volver a iniciar sesión?

Gracias

Respuesta

2

MEF no soporta el aislamiento dominio de aplicación, por lo que lamentablemente, incluso durante la recomposición, esas asambleas que habían sido previamente cargado están siendo cargados en el dominio de aplicación principal de la aplicación web. Hay dos cosas que había necesidad de combatir en ASP.NET:

  1. Cualquier cambio en los archivos físicos (por ejemplo, .aspx, .cshtml, etc), o cualquier cambio a los archivos de configuración (.config), o cualquier cambio al directorio \ bin causará que la aplicación sea reciclada. Esto se debe a dos cosas: la supervisión de archivos de páginas/configuraciones y la supervisión de archivos del directorio \ bin (que se debe a que ASP.NET utiliza por omisión la copia oculta de archivos, esto es recomendable).

  2. Usar MEF en otro dominio de aplicación requeriría una cantidad espantosa de comunicación entre dominios, ya sea a través de la serialización o MarshalByRef, lo cual no creo que sea una implementación limpia. No estoy seguro de cómo desencadenarías BuildProvider instancias utilizadas para compilar dinámicamente tus páginas en otro AppDomain.

Me pregunto si estás pensando en esto demasiado. Desde IIS6, HTTP.SYS ha gestionado el enrutamiento de las solicitudes entrantes al sitio web apropiado, esto se maneja a nivel de kernel. Incluso si la aplicación principal se reinició (que hay una variedad de razones por las que podría), no se eliminarán solicitudes, simplemente cola esperando un nuevo proceso de trabajo antes de pasar la solicitud. Claro, desde el punto de vista del usuario, es posible que observe algún tiempo de inactividad esperando que la nueva aplicación se reinicie, pero de forma realista, ¿con qué frecuencia hará estos cambios?

Muchos diseños de aplicaciones sufren de sobreingeniería. Es posible que desee diseñar para cada escenario, pero de manera realista es más fácil mantener un sistema que es simple pero extensible. En mi opinión, querer hacer lo que ha especificado se clasificaría como sobreingeniería. Mantenlo simple.

+0

Entonces, su recomendación en pocas palabras es reciclar el grupo y luego volver a cargar los nuevos ensamblajes? ¿Te estoy entendiendo correctamente? – Mark

+1

En una palabra, sí. Puede parecer una respuesta decepcionante para usted, pero las aplicaciones ASP.NET están diseñadas para ejecutarse de esta manera. Cuando planifica el conjunto de características para su aplicación, vale la pena considerar si la característica que está diseñando es para los casos de uso más comunes o no. ¿Tiene sentido? –

+0

Tuve la idea de crear una aplicación web secundaria (aplicaciones web anidadas) para poder reciclar la aplicación secundaria y no la principal. ¿Qué piensas sobre eso? Puede ser un poco más de trabajo, pero me da más flexibilidad, ¿no es así? – Mark

0

El uso de la sesión "StateServer" conservará la autenticación entre los reciclados del grupo de aplicaciones (causado por las actualizaciones de archivos).

Para su pregunta fue:

  • Crear una carpeta fuera de su sitio web que su piscina tiene acceso la aplicación.
  • Ponga sus nuevos montajes allí
  • tener un servicio/Tema/web del Grupo de que lee la carpeta y carga los ensamblados en la corriente de aplicaciones de dominio
    • La nueva versión del ensamblado debe prevalecer cuando se crea una instancia

supongo que su pregunta está diciendo que este método no funciona? ¿Qué error está obteniendo ...

Cuestiones relacionadas