8
votes

Modification de la configuration de l'application sans redémarrage d'applications

J'ai le problème suivant: J'introduit une nouvelle fonctionnalité dans l'application (exécutée en tant que service Windows) et j'aimerais avoir cette nouvelle fonctionnalité contrôlée (activée / désactivée) à l'aide d'une entrée de fichier de configuration ( mykey ). Je peux stocker la saisie de configuration dans App.Config, mais si je veux le modifier à partir de l'ON-> OFF ou sinon, il faudrait redémarrer le service Windows, et je souhaite l'éviter. Je veux que mon application exécute et récupérez des modifications de la configuration.

La question est la suivante: y a-t-il une construction de mécanisme dans .NET qui répond à ce problème? Je suppose que je pourrais créer mon propre fichier de configuration, puis utiliser fichiersystemwatcher code> etc ... mais peut-être .NET permet d'utiliser des fichiers de configuration externes et de rechargera la valeur ?? P>

static void Main(string[] args)
{
    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    // AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings");
    for (int i = 0; i < 10; i++)
    {
        ConfigurationManager.RefreshSection("appSettings");
        AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings");
        string myConfigData = appSettingSection.Settings["myConfigData"].Value; // still the same value, doesn't get updated
        Console.WriteLine();
        Console.WriteLine("Using GetSection(string).");
        Console.WriteLine("AppSettings section:");
        Console.WriteLine(
          appSettingSection.SectionInformation.GetRawXml()); // also XML is still the same
        Console.ReadLine();
    }
}


0 commentaires

3 Réponses :


6
votes

Une fois que le fichier APP.Config d'origine est chargé, ses valeurs sont mises en cache afin que vous sachiez, vous devrez redémarrer l'application. Le moyen de créer un nouvel objet de configuration et de lire les touches manuellement comme ceci:

var appConfig = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
string myConfigData = appConfig.AppSettings.Settings["myConfigData"].Value;


3 commentaires

Merci! Mais toujours: de cette façon chaque fois que j'accède à MyConfigdata, je devrais créer un nouvel objet de configuration pour être sûr que appconfig.appsettings.Settings ["myconfigdata"]. La valeur est cohérente avec la valeur sous-jacente dans l'app.config.


Juste appelez configurationmanagerager.refresection ("appsettings"); avant d'appeler appconfig.appsettings.Settings ["myconfigdata"]. Valeur; qui obligera l'application à lire le nouveau & Modification des paramètres. Sinon, ConfigurationManager ne cache toutes les valeurs.


@Teomansoygul Actualisection Mises à jour d'appel Valeur récupérée via le ConfigurationManager.AppSettings [] Cela n'affecte pas une instance de configuration.



1
votes

Si vous traitez la configuration manuellement (peut-être pas dans le fichier app.config), vous pouvez vérifier périodiquement ce fichier pour les mises à jour.

FileSystemwatcher est ... probablement surkill et n'est pas garanti dans tous les scénarios. Personnellement, je voudrais juste interroger le fichier tous les 30 secondes.


2 commentaires

Bonjour, voulez-vous dire la mise en commun en utilisant une solution décrite par @teoman Soygul. Je rechargeant ce réglage toutes les 1 minute satisferait mes besoins.


@dagonfly bien, sorte de; Bien que je ne puissiez pas nécessairement utiliser le chemin d'application de configuration. Toute route fonctionnera cependant; Cela n'a pas besoin d'être complexe.



0
votes

rafraîchissez simplement les "appSettings" dans le fichier de configuration actuel avant de lire la valeur: xxx

pas besoin de le compliquer en créant une autre configuration ou configuration ou ce qui a donc été suggéré dans votre question ou d'autres réponses!


0 commentaires