Utilisation de ConfigurationManager pour charger la configuration depuis un emplacement arbitraire

Je développe un composant d’access aux données qui sera utilisé dans un site Web contenant un mélange de pages ASP et ASP.NET classiques, et qui nécessite un bon moyen de gérer ses parameters de configuration.

J’aimerais utiliser une ConfigurationSection personnalisée, et pour les pages ASP.NET, cela fonctionne très bien. Mais lorsque le composant est appelé via COM Interop à partir d’une page ASP classique, le composant ne s’exécute pas dans le contexte d’une demande ASP.NET et n’a donc aucune connaissance de web.config.

Existe-t-il un moyen d’indiquer au ConfigurationManager de charger simplement la configuration à partir d’un chemin arbitraire (par exemple ..\web.config si mon assembly se trouve dans le dossier /bin )? Si tel est le cas, je pense que mon composant peut y revenir si ConfigurationManager.GetSection par défaut renvoie null pour ma section personnalisée.

Toute autre approche serait la bienvenue!

Essaye ça:

 System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap); 

Une autre solution consiste à remplacer le chemin du fichier de configuration de l’environnement par défaut.

Je trouve que c’est la meilleure solution pour le chargement de fichier de configuration de chemin non sortingvial, en particulier le meilleur moyen d’attacher un fichier de configuration à dll.

 AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", ); 

Exemple:

 AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config"); 

Plus de détails peuvent être trouvés sur ce blog .

En outre, cette autre réponse a une excellente solution, complète avec du code pour actualiser la configuration de l’application et un object IDisposable pour le restaurer à son état d’origine. Avec cette solution, vous pouvez garder la configuration d’application temporaire définie:

 using(AppConfig.Change(tempFileName)) { // tempFileName is used for the app config during this context } 

La réponse d’Ishmaeel fonctionne généralement, mais j’ai trouvé un problème, à savoir OpenMappedMachineConfiguration semble perdre vos groupes de sections hérités de machine.config. Cela signifie que vous pouvez accéder à vos propres sections personnalisées (qui sont tout ce que l’OP veut), mais pas aux sections système normales. Par exemple, ce code ne fonctionnera pas:

 ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap); MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null 

Fondamentalement, si vous surveillez la configuration.SectionGroups , vous verrez que system.net n’est pas enregistré en tant que SectionGroup, donc il est pratiquement inaccessible via les canaux normaux.

Il y a deux façons de contourner ce problème. Le premier, que je n’aime pas, consiste à ré-implémenter les groupes de sections du système en les copiant depuis machine.config dans votre propre fichier web.config, par exemple

   

Je ne suis pas sûr que l’application Web proprement dite fonctionnera correctement après cela, mais vous pouvez accéder aux groupes de section correctement.

La deuxième solution consiste plutôt à ouvrir votre web.config en tant que configuration EXE, ce qui est probablement plus proche de sa fonction prévue:

 ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath }; Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns valid object! 

Je pense qu’aucune des réponses fournies ici, ni la mienne, ni celle d’Ishmaeel, n’utilisent assez ces fonctions comme le souhaitaient les concepteurs .NET. Mais cela semble fonctionner pour moi.

En plus de la réponse d’Ishmaeel, la méthode OpenMappedMachineConfiguration() retournera toujours un object Configuration . Donc, pour vérifier si elle est chargée, vous devriez vérifier la propriété HasFile où true signifie qu’elle provient d’un fichier.

J’ai fourni les valeurs de configuration au mot hébergé .nET Compoent comme suit.

Un composant de bibliothèque de classes .NET appelé / hébergé dans MS Word. Pour fournir des valeurs de configuration à mon composant, j’ai créé winword.exe.config dans le dossier C: \ Program Files \ Microsoft Office \ OFFICE11. Vous devriez pouvoir lire les valeurs de configuration comme vous le faites dans .NET traditionnel.

 ssortingng sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"]; 

Pour ASP.NET, utilisez WebConfigurationManager:

 var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/"); (..) config.AppSettings.Settings["xxxx"].Value; 

Utiliser le traitement XML:

 var appPath = AppDomain.CurrentDomain.BaseDirectory; var configPath = Path.Combine(appPath, baseFileName);; var root = XElement.Load(configPath); // can call root.Elements(...) 

Cela devrait faire l’affaire :

 AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "newAppConfig.config); 

Source: https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files