2011-10-16 29 views
6

Me pregunto si una clase estática en un ASP.NET MVC aplicación podría ser inicializado más de una vez. Inicialmente diseñé mi aplicación para que un componente estático obtuviera algunas cosas de la base de datos y sirviera como caché, y agregué un método de actualización a la clase que fue llamada desde el constructor. El método de actualización también estuvo disponible a través de la parte de administración de la aplicación. En algún momento noté que los datos se actualizaron sin requerir este activador manual, lo que implica que el constructor estático se ejecuta más de una vez.clase estática en Asp.NET MVC aplicación

Existen varias situaciones en las que podría ver esto de forma razonable, como un Exception no administrado que causa la reinicialización. Pero estoy teniendo problemas para reproducir esto, así que me gustaría saberlo con certeza.

+1

Asegúrate de que tu clase ** esté ** completamente segura para subprocesos. – SLaks

Respuesta

10

Los escenarios más habituales serían:

  • una recarga de la aplicación web

    • tocó Web.config
    • binarios tocó
    • terminación anormal (fuera de la memoria , errores de permiso)
  • una recarga del grupo de aplicaciones

  • un reinicio de IIS
  • un reinicio de w3wp.exe (al menos una vez en 29 horas!)

conseguirá volver a cargar el App-dominio (recompilar el partes dinámicas según sea necesario) y esto anularía cualquier dato inicializado estáticamente.

Puede evitar esto al conservar los datos estáticos en alguna parte si crearlos es costoso, o evitar volver a cargar el AppDomain, el grupo de aplicaciones o el servidor IIS.

actualización: Phil Haack acaba de publicar una entrada de blog relevante aquí: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

  • adiós App dominio
    • que hace un mejor trabajo de explicar lo anterior . Notable, IIS reciclar es el proceso de trabajo muy en 29 horas mínimo y hosters compartidos reciclarán dominio de aplicación mucho más a menudo (tal vez en 20 minutos de inactividad)
  • así que informe a ASP.NET, “Hey, soy ¡trabajando aquí!”
    • esboza las técnicas que se pueden aplicar para ser notificado de un dominio de aplicación derribar - que podría utilizar esto para conseguir la instancia Singleton comportarse 'correctamente'
  • Recomendación

Sugiero que lo leas :)

+0

Update_: Phil Haack acaba de publicar una entrada de blog relavent aquí: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx . Actualicé la respuesta para reflejar la información recabada – sehe

+1

Recientemente descubrí que mi problema se debía a la recarga de los tiempos de espera de Application Pool, que está programado para matar aplicaciones que han estado inactivas durante 20 minutos o más. Esto fue en Windows Azure, y [esta publicación] (http://blog.smarx.com/posts/controlling-application-pool-idle-timeouts-in-windows-azure) me ayudó a resolver mi problema. – Gleno

4

static las clases se inicializan una vez por AppDomain.

Si IIS recicla su AppDomain, todo se reinicializará.

+0

¿Puede IIS reciclar mi AppDomain cuando se siente así? – Gleno

+0

Sí; puede y quiere Creo que esto es algo configurable. – SLaks

+0

Estoy usando Azure, para abstraerme más lejos de las configuraciones de IIS; pero esto es bueno saberlo – Gleno

Cuestiones relacionadas