2008-09-01 30 views
37

Estoy tratando de averiguar qué es exactamente el reciclaje Appdomain? Cuando se solicita una página aspx por primera vez desde una aplicación DotNet, entiendo que se crea un dominio de aplicación para esa aplicación, y los ensamblados necesarios se cargan en ese dominio de aplicación, y se servirá la solicitud. Ahora, si se modifica el archivo web.config o el contenido de la carpeta bin, etc., el dominio de aplicación se "reciclará". Mi pregunta es, al final del proceso de reciclaje, ¿se cargará el appdomain con ensamblajes y estará listo para servir la próxima solicitud? o se debe solicitar una página para activar los ensamblajes para cargar ?.¿Qué es exactamente Appdomain reciclaje

Respuesta

60

Bueno, creo que el hilo estaba llegando sin problemas a una conclusión final, pero al final, fue de otra manera.

Trataré de responder a la pregunta en función de mi comprensión y aprovechando lo que acabo de leer en otros sitios web.

En primer lugar, yo mismo trato de evitar el término reciclar que no sea para Grupos de aplicaciones, ya que esto puede confundir a alguien.Ahora, llegando a proceso, pools y AppDomain, veo la imagen de la siguiente manera:

Un grupo de aplicaciones es, en resumen, una región de memoria que se mantiene funcionando mediante un proceso llamado W3WP.exe, también conocido como Proceso de trabajo . Reciclar un grupo de aplicaciones significa reducir ese proceso, eliminarlo de la memoria y luego generar un nuevo proceso de trabajo, con un nuevo ID de proceso asignado.

En relación con los dominios de aplicación, lo veo como subconjuntos de regiones de memoria, dentro de la región mencionada que desempeña el papel de un contenedor. En otras palabras, el proceso en memoria, W3WP.exe en este caso, es una región de memoria macro para aplicaciones que almacena regiones de subconjuntos, denominadas Dominios de aplicación. Habiendo dicho eso, un proceso en la memoria puede almacenar diferentes dominios de aplicación, uno para cada aplicación que está asignada para ejecutarse dentro de un grupo de aplicaciones dado.

Cuando se trata de reciclaje, como dije inicialmente, es algo que yo mismo reservo solo para Application Pools. Para AppDomains, prefiero usar el término 'reiniciar', para evitar una idea errónea. En función de esto, reiniciar un AppDomain significa iniciar una aplicación determinada con la configuración recién agregada, como actualizar la configuración existente. Eso ocurre dentro de los límites de esa subregión de memoria, llamada AppDomain, que finalmente se encuentra dentro del proceso asociado con un grupo de aplicaciones respectivo. Esos nuevos ajustes pueden provenir de archivos tales como

web.config, machine.config, Global.asax, directorio Bin, App_Code,

y puede haber otros.

AppDomain están aislados unos de otros, eso tiene mucho sentido. Si no es así, si se realizan cambios en un archivo web.config, digamos, de la aplicación 1, reciclaje reembolsado del grupo, se reiniciarán todas las demás aplicaciones asignadas a ese grupo, lo que definitivamente no era deseado por Microsoft ni por nadie más.

Resumiendo mi punto,

  • Proceso (W3WP.exe)
    • dominio de aplicación 1
    • dominio de aplicación 2
    • dominio de aplicación 3
    • dominio de aplicación n

n = el número de aplicaciones asignadas al grupo de aplicaciones gestionado por el dado W3WP.exe

  • Los procesos son regiones de memoria aislados uno de otro
  • AppDomains son regiones sub-memoria aislados uno de otro, dentro de el mismo proceso
  • Los cambios en la configuración global de IIS pueden requerir el reciclaje del grupo de aplicaciones (lo que elimina y comienza un nuevo proceso de trabajo, W3WP).exe)
  • ajustes a nivel de aplicación cambia AppDomains preocupaciones, y se pueden conseguir reiniciado después de cambios en algunos archivos específicos como los esbozar anteriormente

Para más información, recomiendo:

http://blogs.msdn.com/b/david.wang/archive/2006/03/12/thoughts-on-iis-configuration-changes-and-when-it-takes-effect.aspx

What causes an application pool in IIS to recycle?

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx

Saludos desde Brasil!

7

Tome un vistazo a esto - que podría explicarlo:

http://weblogs.asp.net/owscott/archive/2006/02/21/ASP.NET-v2.0-2D00-AppDomain-recycles_2C00_-more-common-than-before.aspx#440333

en general. Lo que se denomina "primer acierto" en un sitio web ASP.NET generalmente lleva más tiempo, debido a la compilación y la creación de un Dominio de aplicación.

Cada vez que implemente un sitio, asegúrese de usar la función "Publicar sitio web" en Visual Studio, para precompilar su sitio web. Luego se reduce la penalización de "primer golpe". ¡Y recuerde configurar la configuración en Liberar, y no en Depurar!

+0

(+1) Gracias por el enlace. Hay un enlace a la publicación de Tess en este artículo, que es una visita obligada. –

1

Si sus páginas son "actualizables", se deben compilar antes de su uso. Eso significa, sí, a primera solicitud, los ensamblajes se cargan, compilan y preparan para acceder. Cada vez que se cambian estos archivos (¡incluso algunos programas de virus pueden activar esto al cambiar la fecha de modificación de los archivos!), El dominio de aplicación se recicla.

Puede configurar su aplicación web para que no sea actualizable. Todo se compila en DLL, y no verá ningún archivo .ASPX o .CS en el directorio virtual. Hace que su código sea más difícil de actualizar (¿necesita agregar texto adicional en su página web? ¡Recompile el tiempo!), Pero aumenta la disponibilidad de su aplicación web.

Sin embargo, esto aún no evitará que su aplicación web sea reciclada si alguno de los archivos se altera. Por ejemplo, si edita web.config, su dominio de aplicación se reciclará incluso si está compilado.

2

Recycle desconecta el proceso que aloja el dominio de aplicación. Notará que el PID cambia cuando lo recicla.

Descarga de la AppDomin simplemente descarga todos los ensamblajes en el Dominio de la Aplicación, que luego puede ser reutilizado.

Lo importante es recordar que una vez que CLR se carga en un proceso, no se puede eliminar. Entonces, si necesita hacer algo tan pronto como se carga el CLR, simplemente descargar el AppDomain no ayudará, porque el CLR no se volverá a cargar.

Además, no es que IIS no sea el único proceso que puede albergar el AppDomain; cualquier proceso puede, y no siempre quiere eliminar todo el proceso para descargar sus ensamblajes.