Comment forcer le pool d'applications IIS à redémarrer chaque fois que le domaine de l'application est rechargé?
Nous avons une ASP.NET MVC 4 application qui se lie à l'héritage du code natif. Le problème est que cet héritage code mondial de la statique qui sont construits au démarrage, mais parce que du code natif ne sait rien à propos de l'App Domaines, que le code n'est pas ré-initialisé lorsque le Domaine d'Application est rechargé. Cela provoque un comportement incorrect ou se bloque dans notre application jusqu'à ce que le Pool d'Applications de processus est redémarré.
À cause de cela, je voudrais forcer l'Application de la Piscine à recycler chaque fois que notre application Domaine d'Application est recyclé. Est-il un paramètre dans IIS pour cela, ou est-il un code que je peux appeler ma demande que le domaine est en cours de déchargement?
Quelques infos sur ma configuration,
- ASP.NET MVC 4 application
- IIS 7.5, mais je peux me déplacer à 8 si nécessaire
- Je peux vous assurer qu'il n'y est une application par Application de la Piscine, donc je ne sera pas affecter les autres applications.
Mise à jour
En fonction de la réponse ci-dessous, j'ai accroché jusqu'à l'AppDomain événement unload et utilisé un code semblable au suivant de recyclage de l'Application de la Piscine.
try
{
//Find the worker process running us and from that our AppPool
int pid = Process.GetCurrentProcess().Id;
var manager = new ServerManager();
WorkerProcess process = (from p in manager.WorkerProcesses where p.ProcessId == pid select p).FirstOrDefault();
//From the name, find the AppPool and recycle it
if ( process != null )
{
ApplicationPool pool = (from p in manager.ApplicationPools where p.Name == process.AppPoolName select p).FirstOrDefault();
if ( pool != null )
{
log.Info( "Recycling Application Pool " + pool.Name );
pool.Recycle();
}
}
}
catch ( NotImplementedException nie )
{
log.InfoException( "Server Management functions are not implemented. We are likely running under IIS Express. Shutting down server.", nie );
Environment.Exit( 0 );
}
source d'informationauteur Rob Prouse
Vous devez vous connecter pour publier un commentaire.
Basé sur votre post, il semble que vous connaissez lorsque vous souhaitez déclencher le redémarrage voici donc une post qui vous dira comment.
Plus brutale approche est d'appeler le Processus.Fonction getcurrentprocess().Kill()
Pas très gracieux, mais si votre site a sa propre application de la piscine et vous n'avez pas de soins de demandes en cours d'être brutalement arrêté, c'est assez efficace!
Simplifié VB version du code que vous avez partagé. Cette version utilise une boucle For au lieu d'une requête LINQ. Aussi, afin d'utiliser Microsoft.Web.L'Administration, vous devez importer le fichier DLL à partir de c:\windows\system32\inetsrv