2009-05-19 4 views
1

J'ai une application ASP.NET qui fait partie d'un système beaucoup plus grand; il lit la plupart de sa configuration à partir de fichiers situés au-dessus du niveau racine de l'application Web.Comment puis-je faire redémarrer ASP.NET lorsqu'un fichier est modifié?

Comme l'application est déjà écrit et le format des fichiers de configuration a été choisie pour faciliter l'édition par les clients, je ne peux pas utiliser la solution dans “Shared configuration files in .NET”.

J'espère que ASP.NET a une API que je peux appeler à le temps de démarrage pour lui dire quel fichier regarder. (Je pourrais écrire cela à la dure en utilisant un "FileSystemWatcher" et attraper des événements puis faire le redémarrage moi-même, mais ce serait dommage car ASP.NET a déjà le code pour regarder les fichiers et redémarrer quand ils sont changés.)

Quelle API ASP.NET dois-je appeler pour redémarrer ASP.NET de manière agréable?

Voici quelques liens que j'ai trouvé qui peuvent aider: Using the FileSystemWatcher from ASP.NET et Extending FileSystemWatcher to ASP.NET


Dans un cas, je mis en mémoire cache la configuration dans le cache ASP.NET et définir un CacheDependency au fichier. Dans l'autre cas qui nécessitait un accès plus rapide, j'ai utilisé un FileSystemWatcher et mis à jour un champ statique lorsque la configuration a changé.

(je ne ai jamais su comment redémarrer ASP.NET à partir du code d'une manière raisonnable.)

Répondre

4
static FileSystemWatcher ConfigWatcher; 

    static void StartWatchConfig() { 

    ConfigWatcher = new FileSystemWatcher("configPath") { 
     Filter = "configFile" 
    }; 

    ConfigWatcher.Changed += new FileSystemEventHandler(ConfigWatcher_Changed); 
    ConfigWatcher.EnableRaisingEvents = true; 
    } 

    static void ConfigWatcher_Changed(object sender, FileSystemEventArgs e) { 
    HttpRuntime.UnloadAppDomain(); 
    } 
+1

La méthode HttpRuntime.UnloadAppDomain() est ce qui me manquait. –

-1

Je pense que vous allez avoir besoin de créer un service qui utilise FileSystemWatcher pour surveiller les modifications des fichiers de configuration en dehors du répertoire de l'application Web - puis, lorsqu'une modification est détectée, effectuez une modification non significative du fichier web.config de l'application Web et enregistrez-la, ce qui entraînera le redémarrage de l'application.

+0

J'espère qu'il ya une meilleure façon –

4

Si vous savez que votre application n'accèdera jamais à la configuration en dehors d'un HttpContext, envisagez de mettre en cache votre configuration et d'ajouter un CacheDependency au fichier. Si le fichier change, votre configuration en cache est supprimée et vous pouvez l'ajouter à nouveau avec des valeurs mises à jour.

Quelque chose comme:

public MyConfigObj GetConfig() 
{ 
    var config = Cache["configkey"] as MyConfigObj; 
    if(config == null) 
    { 
     var configPath = Server.MapPath("myconfigpath"); 
     config = GetConfigFromFile(configPath); 
     Cache.Insert("configkey", config, new CacheDependency(configPath)); 
    } 
    return config; 
} 
+0

Merci, cette réponse sera utile à un grand nombre de personnes; Cependant, nous devons faire un redémarrage pour utiliser la configuration modifiée. Si je commençais à nouveau ce serait une option intéressante à considérer –

+0

Je suis l'exception cette réponse, comme le plus proche de résoudre mon problème de racine. J'ai mis en cache un de mes fichiers de configuration; dans l'autre cas, j'ai utilisé un FileSystemWatcher et mis à jour un champ statique lorsque le fichier a changé. –

-1

réponse stupide peut-être, mais vous pouvez toujours « toucher » (ajouter quelques espaces ou quelque chose) votre fichier web.config et qui déclenchera un redémarrage. Il est le pauvre iisreset de l'homme =)

(Je veux souligner à nouveau que ce n'est pas une solution idéale pour remise en marche générale des sites Web ou IIS réinitialisation)

+0

Le problème est que nous recevons beaucoup de rapports de bugs lorsque les gens oublient de le faire! –

+0

Ensuite, je me tournerais vers une solution de déploiement automatisée telle que TeamCity ou CruiseControl.net qui automatisera les déploiements et sera suffisamment configurable pour «toucher» le fichier web.config. –

+0

Nos clients utilisent notre application sur leurs propres serveurs, etc., au sein de leur propre réseau. (C'est une * application * que nous vendons, il arrive juste d'utiliser du HTML pour une partie de son interface) –

1

Pour la deuxième partie, vous pouvez utiliser la pièce suivante code pour déclencher un recyclage AppPool (qui est le même que le redémarrage d'IIS, uniquement au niveau de l'application au lieu du serveur entier).

using System.DirectoryServices; 

public void RecycleAppPool(string machine, string appPoolName) 
{ 
    string path = "IIS://" + machine + "/W3SVC/AppPools/" + appPoolName; 
    DirectoryEntry w3svc = new DirectoryEntry(path); 
    w3svc.Invoke("Recycle", null); 
} 

(de here)

Questions connexes