web-dev-qa-db-fra.com

Rechargement de la configuration sans redémarrer l'application à l'aide de ConfigurationManager.RefreshSection

Quelqu'un at-il obtenu ce travail dans une application Web?

Peu importe ce que je fais, il semble que ma section appSettings (redirigée depuis web.config à l'aide du fichier appSettings = ".\Site\site.config") ne soit pas rechargée.

Suis-je condamné à devoir simplement redémarrer l'application? J'espérais que cette méthode me conduirait à une solution plus performante.

Mettre à jour:

Par "rechargement", j'entends l'actualisation de ConfigurationManager.AppSettings sans avoir à redémarrer complètement mon application ASP.NET et sans encourir la latence de démarrage habituelle.

39
Kieran Benton

Assurez-vous que vous transmettez la bonne valeur sensible à la casse à RefreshSection, c'est-à-dire.

ConfigurationManager.RefreshSection("appSettings");
49
G-Wiz

Cela semble être une faille (peut-être un bogue) lors de l'utilisation d'un fichier de configuration externe pour vos appSettings. Je l'ai essayé en utilisant l'attribut configSource et RefreshSection ne fonctionne tout simplement jamais, je suppose que c'est la même chose lorsque vous utilisez l'attribut file. Si vous déplacez vos appSettings dans votre web.config RefreshSection fonctionnera parfaitement mais sinon j'ai bien peur que vous soyez condamné.

14
Adam

Pour une raison quelconque, ConfigurationManager.RefreshSection("appSettings") ne fonctionnait pas pour moi. Le rechargement de Web.Config dans un objet Configuration semble fonctionner correctement. Le code suivant suppose que le fichier Web.Config est un répertoire sous le dossier d'exécution (bin).

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
Uri uriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase));
string appPath = uriAssemblyFolder.LocalPath;
configMap.ExeConfigFilename = appPath + @"\..\" + "Web.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); 

Et est utilisé comme:

string webConfigVariable = config.AppSettings.Settings["webConfigVariable"].Value;
4

Vous pouvez également écrire votre propre ConfigSection et définir restartOnExternalChanges="false".

Ensuite, lors de la lecture de la section avec ConfigurationManager.GetSection("yourSection") les paramètres seront actualisés automatiquement sans redémarrage de l'application.

Et vous pouvez implémenter vos paramètres fortement saisis ou en tant que NameValueCollection.

3
Martin Meixger

.RefreshSection () ne fonctionne pas lorsque appSettings est externe.

Vous pouvez cependant utiliser ce qui suit pour modifier une valeur:

ConfigurationManager.AppSettings.Set(key, value)

Cela ne modifiera PAS le paramètre du fichier, uniquement la valeur chargée en mémoire.

Donc, au lieu d'utiliser RefreshSection, j'ai fait ce qui suit:

string configFile="path to your config file";
XmlDocument xml = new XmlDocument();
xml.Load(configFile);

foreach (XmlNode node in xml.SelectNodes("/appSettings/add"))
{
    string key = node.Attributes["key"].Value;
    string value= node.Attributes["value"].Value;
    ConfigurationManager.AppSettings.Set(key, value);
}

Tout appel ultérieur à AppSettings.Get contiendra la valeur mise à jour.

Les paramètres d'application seront ensuite mis à jour sans avoir à redémarrer l'application.

2
Allie

Oui. vous êtes bloqué avec le redémarrage d'iis.

Il existe une fonctionnalité avec asp.net 4.0 et iis 7.5 où le démarrage initial est supprimé.

0
yamspog

Je ne sais pas si cela est possible dans une application Web, mais cela fonctionne dans une application de bureau. Essayez d'utiliser ConfigurationSettings plutôt que ConfigurationManager (il vous hurlera d'utiliser des classes obsolètes ...), puis lisez toutes les données dans une classe. Lorsque vous souhaitez actualiser, créez simplement une nouvelle instance et supprimez toutes les références à l'ancienne instance. Ma théorie pour expliquer pourquoi cela fonctionne (peut-être faux): lorsque vous n'accédez pas directement au fichier app.config pendant toute la durée de l'exécution, le verrouillage du fichier est supprimé par l'application. Ensuite, des modifications peuvent être apportées lorsque vous n'accédez pas au fichier.

0
badpanda