2009-01-02 58 views
24

¿Existe alguna forma recomendada de hacer rebotar una aplicación asp.net además de tocar web.config desde el interior de la aplicación? es HttpRuntime.UnloadAppDomain(); la forma preferida de hacer esto? y si es así, ¿dónde haces esto? ¿En la descarga de una página o algún otro lugar en la aplicación?cómo reiniciar la aplicación asp.net además de modificar web.config

Respuesta

12

Si se trata de .NET 2.0 o superior, puede agregar un archivo "App_offline.htm", realizar una solicitud al servidor, eliminarla y luego realizar otra solicitud al servidor.

Esta secuencia de eventos obligará a ASP.NET a descargar la aplicación mientras exista el archivo app_offline.htm en la carpeta.

el blog de Scott Guthrie en él: http://weblogs.asp.net/scottgu/archive/2005/10/06/426755.aspx

+0

no es solo desconectar el sistema. Quiero que se reinicie/vuelva a cargar con la limpieza de la memoria caché/sesión y cosas así. cuando elimino el app_offline.htm esto lo traerá de vuelta por defecto? – MikeJ

+0

@MikeJ - no. Cierra la aplicación y descarga el dominio de la aplicación del servidor hasta que se elimine el archivo. –

+3

@MikeJ - También tenga en cuenta que esto NO es un cambio programático. Necesitará agregar y eliminar físicamente el archivo para que funcione –

6

Puede detener e iniciar el grupo de aplicaciones asociado con la aplicación también.

+0

pero esto es de IIS a la derecha. en algunos casos, es posible que no tenga acceso al cuadro de IIS, así que estoy buscando algo programático. – MikeJ

+1

Puede reciclar el grupo de aplicaciones utilizando WMI: http://blogs.iis.net/chrisad/archive/2006/08/30/Recycling-Application-Pools-using-WMI-in-IIS-6.0.aspx – Portman

+0

cool. No sabía que – MikeJ

22

web.config Tocar desde dentro de una aplicación es una mala idea, la OMI. Además, la idea de tener un archivo que modifique es un pequeño truco, IMO.

La documentación indica específicamente que se UnloadAppDomain apagar la aplicación:

UnloadAppDomain permite el apagado programática de aplicaciones no utilizadas.

Debería poder realizar esta llamada en cualquier lugar de la aplicación. Eso sí, puede obtener un SecurityException, así que asegúrese de que el tiempo de ejecución le otorgue los permisos apropiados (puede ponerlo en una biblioteca y hacer una llamada y luego configurar la biblioteca en el GAC con evidencia para darle plena confianza)

+2

sí. esta es la razón por la que estaba preguntando. La modificación de web.config parecía fea y podría hacernos escribir en thedailyWTF.com :) – MikeJ

+2

Creo que una línea mejor para citar sería: "Termina la aplicación actual. La aplicación se reinicia la próxima vez que se reciba una solicitud para ella". La parte "no utilizada" en esa cita se puede leer como "solo se cerrará si nadie la está usando", que no es el caso. –

+2

Use System.Web.HttpRuntime.UnloadAppDomain() –

0

Si no desea detener e iniciar el grupo de aplicaciones siempre puede reciclarlo.

2

Puede reiniciar de forma segura una aplicación web creando o renombrando una carpeta en tiempo de ejecución bajo el directorio de la aplicación. Obviamente, debe otorgarle al usuario asignado para ejecutar la aplicación los derechos de "modificación" al directorio web o a un subdirectorio debajo de él.

el método se menciona en http://www.bartlannoeye.be/blog/restarting-a-.net-web-application-without-restarting-iis

He utilizado el siguiente código para hacerlo en mi caso. Modificarlo para que funcione en un subdirectorio "editable"

protected void RestartButton_Click(object sender, EventArgs e) 
{ 
    //restart web app (instead of iisreset) 
    DirectoryInfo dir = new DirectoryInfo(Server.MapPath("restart")); 
    if (dir.Exists) 
    { 
     Directory.Move(dir.FullName, dir.FullName + "ed"); 
    } 
    else 
    { 
     DirectoryInfo dired = new DirectoryInfo(Server.MapPath("restarted")); 
     if (dired.Exists) 
     { 
      Directory.Move(dired.FullName, dir.FullName); 
     } 
     else 
     { 
      Directory.CreateDirectory(dir.FullName); 
     } 
    } 
} 
+0

bien, esto no funciona para mí. ¡Veo que se está creando el directorio pero no se llama al evento application_Start! – KMX

+0

Ese enlace de Bart Lannoeye parece estar muerto – brennanyoung

7

este código funciona para mí. solo llámalo para volver a cargar la aplicación.

System.Web.HttpRuntime.UnloadAppDomain(); 

Read more

Este método se acaba de descargar nuestra aplicación.Si acaba de poner este método en un botón web de ASP.NET, está totalmente hecho. Entonces, ¿cuándo se volverá a cargar nuestra aplicación? De hecho, si hace clic en su botón, primero se iniciará nuestro método y descargará la aplicación. Además, en la página web en la que estamos en ese momento también se volverá a cargar, porque simplemente hicimos clic en un botón y la página web debería actualizarse. Después de iniciar nuestro método, el proceso de actualización de la página hará que nuestra aplicación se vuelva a cargar también.

+0

Parece que funciona bien, ¡y definitivamente es la solución más simple que se ofrece aquí! –

Cuestiones relacionadas