17

ACTUALIZACIÓN - proceso para replicar tema:ASP.NET se reinicia cuando se crea una carpeta, renombrado o eliminado

1) Crear un proyecto de sitio web en c: \ proyectos \ reinicio-demo

2) Añadir web.config defecto y una página aspx ficticia test.aspx

3) Mapa de IIS para que apunte a la carpeta raíz c: \ proyectos \ reinicio-demo

4) Monitorear reinicia la aplicación utilizando Monitor de rendimiento, vigilancia de la salud, el seguimiento en Application_End Global.asax, etc.

5) Solicitud de la página en el navegador http://localhost/test.aspx

Inicio de aplicación

6) Crear nueva carpeta c: \ projects \ restart-demo \ asdf

final de aplicación

7) página de solicitud en el navegador http://localhost/test.aspx

Inicio de aplicación

8) Cambiar nombre de carpeta c: \ projects \ reinicio-demo \ asdf a c: \ projects \ reinicio-demo \ asdf1

aplicación final

final update

Estamos utilizando un CMS back-end para generar archivos y carpetas en un sitio ASP.NET.

Los usuarios pueden crear/modificar/eliminar archivos y enviarlos al conjunto de servidores web.

Uno de los problemas que hemos notado:

Cuando el usuario crea, cambia el nombre o elimina una carpeta, hace que el dominio aplicación para reiniciar. Como consecuencia, la sesión , el caché, etc. se pierden.

Tenga en cuenta que no necesita ser una carpeta especial como/bin o/App_Code tampoco.

¿Hay alguna manera de evitar este comportamiento?

Está muy obstaculizando el rendimiento por dos razones:

  • caché es objeto de dumping cuando el dominio aplicación reinicia
  • dominio
  • aplicación necesita ser reconstruido después de reiniciar
+1

¿Esto sucede el 100% del tiempo, o cuando se dice, se crea un cierto número, como cada 15º cambio? –

+0

El comportamiento que describes no es típico. ¿Podrías darnos un poco más de información contexual, tal vez? –

+0

@Nick: esto ocurre todo el tiempo. – frankadelic

Respuesta

15

Este código aparece para resolver el problema, cuando se añade a Application_Start() en Global.asax:

PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); 
object o = p.GetValue(null, null); 
FieldInfo f = o.GetType().GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase); 
object monitor = f.GetValue(o); 
MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic); 
m.Invoke(monitor, new object[] { }); 

http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/12/disable-session-expiration-when-using-directory-delete.aspx

Con estos cambios, puedo crear/modificar/borrar carpetas sin causar la aplicación para reiniciar

No está claro si esta es la mejor solución - No sé si habrá efectos secundarios no deseados debido a la llamada a StopMonitoring.

+1

Parece un gran truco, pero si funciona, supongo que no tienes otra opción. +1 por informar su solución. – mxmissile

+0

También hay un ejemplo más completo de cómo hacer esto aquí: http://www.aaronblake.co.uk/blog/2009/09/28/bug-fix-application-restarts-on-directory-delete-in- asp-net / –

0

Habilitar ASP.NET Health Monitoring y buscar en el registro de eventos para ver por qué se reinició AppDomain.


Apuesto a que esto se debe a que ha utilizado un proyecto de sitio web, en lugar de un proyecto de aplicación web. Intenta reproducir esto con un proyecto de aplicación web.

Además, ¿tiene algún software antivirus o de indexación ejecutándose? Tal software avisa cuando se crean y/o modifican las carpetas.

+0

Mensaje del evento: La aplicación se está cerrando. Razón desconocida. – frankadelic

+0

Acabo de intentarlo con Web Application Project. Mismo problema. – frankadelic

+0

Gracias por consultar. En este caso, sugiero que busque un software antivirus y tal vez un software de indexación. ASP.NET no causa reinicios cada vez que se crean carpetas - algo más _is_. –

2

Por defecto, una aplicación asp.net se reinicia cada 15 veces que un archivo cambia dentro de su directorio virtual, esto es para compensar las recompilaciones parciales y su peso de memoria frente al rendimiento general ... puede cambiar este comportamiento, pero el uso de memoria el aumento y el rendimiento disminuirán con el tiempo.

Para ello, establezca la numRecompilesBeforeAppRestart attribute on the compilation element, su web.config tendría en elemento de la siguiente manera:

<configuration> 
    <system.web> 
    <compilation numRecompilesBeforeAppRestart="15"> 

El valor por defecto es 15, puede cambiarlo a lo que usted quiere, leer el enlace para más información . Sin embargo, es así por una razón, no se recomienda tener su contenido dinámico dentro del directorio virtual de la aplicación, es mejor tenerlo junto a él o en otro lugar completamente.

+0

No hay nada recompilante. Solo estoy creando carpetas vacías. Además, modifiqué numRecompilesBeforeAppRestart y Application_End todavía se activa cada vez que se crea/modifica/elimina una carpeta. – frankadelic

+0

@frankadelic - ¿Se puede actualizar con un ejemplo de unas pocas carpetas que se están creando, en relación con la raíz? –

+0

Se agregaron pasos para replicar el problema. – frankadelic

9

Tal vez un poco tarde, pero el almacenamiento y el manejo de los archivos temporales en una carpeta diferente fuera de wwwroot de la aplicación también resuelve el problema.

2

Al agregar "fcnMode="Disabled" a la configuración <httpRuntime> en web.config se desactiva el reciclaje de AppDomain cuando se modifican los contenidos de la carpeta raíz web.

Cuestiones relacionadas