Utilisation de ConfigurationManager pour charger la configuration à partir d'un emplacement arbitraire

StackOverflow https://stackoverflow.com/questions/4738

Question

Je développe un composant d'accès aux données qui sera utilisé dans un site Web contenant un mélange de pages ASP et ASP.NET classiques, et j'ai besoin d'un bon moyen de gérer ses paramètres de configuration.

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

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

Toute autre approche serait la bienvenue !

Était-ce utile?

La solution

Essaye ça:

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

Autres conseils

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 du fichier de configuration à chemin non trivial, en particulier la meilleure façon de joindre le fichier de configuration à la DLL.

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);

Exemple:

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

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

En plus, cette autre réponse A une excellente solution, complète avec du code pour actualiser la configuration de l'application et un IDisposable objet pour le réinitialiser à son état d'origine.Avec cette solution, vous pouvez garder la configuration de l'application temporaire dans la portée:

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 l'utilisation de 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 (c'est tout ce que l'OP souhaite), mais pas aux sections normales du système.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

En gros, si vous mettez une montre sur le configuration.SectionGroups, vous verrez que system.net n'est pas enregistré en tant que SectionGroup, il est donc quasiment inaccessible via les canaux normaux.

J'ai trouvé deux façons de contourner ce problème.La première, que je n'aime pas, consiste à réimplémenter les groupes de sections système en les copiant de machine.config dans votre propre web.config, par exemple.

<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </sectionGroup>
</sectionGroup>

Je ne suis pas sûr que l'application Web elle-même fonctionnera correctement après cela, mais vous pouvez accéder correctement aux sectionsGroups.

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 de toute façon :

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!

J'ose dire qu'aucune des réponses fournies ici, ni la mienne ni celle d'Ishmaeel, n'utilise vraiment ces fonctions comme les concepteurs .NET l'avaient prévu.Mais cela semble fonctionner pour moi.

En plus de la réponse d'Ismaël, la méthode OpenMappedMachineConfiguration() renverra toujours un Configuration objet.Donc, pour vérifier s'il est chargé, vous devriez vérifier le HasFile propriété où true signifie qu'elle provient d'un fichier.

J'ai fourni les valeurs de configuration au composant .nET hébergé par Word comme suit.

Un composant de la 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 être capable de lire les valeurs de configuration comme vous le faites dans .NET traditionnel.

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

La réponse acceptée est fausse !!

Il lève l'exception suivante lors de l'accès à la propriété AppSettings :

Impossible de convertir un objet de type « System.Configuration.DefaultSection » en type « System.Configuration.AppSettingsSection ».

Voici la bonne solution :

System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

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/Pourquoi-Where-and-How-of-NET-Configuration-Files

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top