133 votes

À l'aide de ConfigurationManager pour charger config à partir d'un emplacement arbitraire

Je suis le développement d'un composant d'accès aux données qui seront utilisées dans un site web qui contient un mélange de classique et d'ASP ASP.NET pages, et ont besoin d'une bonne façon de gérer ses paramètres de configuration.

Je voudrais utiliser une coutume ConfigurationSection, et pour le ASP.NET pages cela fonctionne très bien. Mais lorsque le composant est appelé via l'interopérabilité COM à partir d'un classique de la page ASP, le composant n'est pas en cours d'exécution dans le cadre d'une ASP.NET demande et, par conséquent, n'a aucune connaissance du web.config.

Est-il un moyen de dire à l' ConfigurationManager à il suffit de charger la configuration à partir d'un chemin arbitraire (par exemple, ..\web.config si mon montage est dans l' /bin le dossier)? S'il y a alors je pense à mon composant peut tomber en arrière pour que si la valeur par défaut ConfigurationManager.GetSection retours null pour ma section personnalisée.

Toutes les autres approches serait la bienvenue!

130voto

Ishmaeel Points 7720

Essayez ceci:

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

74voto

YoYo Points 851

Une autre solution consiste à remplacer la valeur par défaut de l'environnement chemin du fichier de configuration.

J'ai trouver la meilleure solution pour les non-trivial-chemin d'accès du fichier de configuration de la charge, plus précisément le meilleur moyen de joindre le fichier de configuration de 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 à ce blog.

En outre, cette réponse est une excellente solution, complète avec le code pour actualiser l'application de config et un IDisposable objet réinitialiser retour à son état d'origine. Avec cette solution, vous pouvez garder l'application temporaires config étendue:

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

42voto

Gavin Points 3871

Ishmaeel de répondre, en général, ne se de travail, cependant, j'ai trouvé un problème, qui est que l'utilisation d' OpenMappedMachineConfiguration semble perdre votre hérité de la section des groupes de la machine.config. Cela signifie que vous pouvez accéder à vos propres articles (qui est de toutes les OP voulu), mais pas le système normal sections. 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 veille sur l' configuration.SectionGroups, vous verrez que system.net n'est pas inscrit comme SectionGroup, de sorte qu'il est à peu près inaccessible via les canaux habituels.

Il ya deux façons que j'ai trouvé pour contourner ce problème. La première, que je n'aime pas, est de re-mettre en œuvre le système de la section des groupes en les copiant à partir de la machine.config dans votre propre site 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 de l'application web elle-même va s'exécuter correctement après cela, mais vous pouvez accéder à la sectionGroups correctement.

La deuxième solution c'est qu'au lieu d'ouvrir votre site web.config comme un fichier EXE de configuration, ce qui est probablement plus proche de sa fonction, 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!

Je crois pouvoir dire aucune des réponses fournies, ni de la mine ou Ishmaeel, sont tout à fait à l'aide de ces fonctions de la façon la .NET concepteurs prévu. Mais, cela semble fonctionner pour moi.

10voto

Joseph Daigle Points 16429

En plus de Ishmaeel réponse, la méthode OpenMappedMachineConfiguration() retournera toujours un Configuration objet. Afin de vérifier pour voir si il chargé, vous devriez vérifier le HasFile de la propriété de la vraie signifie qu'il est venu à partir d'un fichier.

4voto

Iftikhar Ali Points 41

J'ai fourni les valeurs de configuration de word hébergé .nET Compoent comme suit.

Un .NET composant de Bibliothèque de classes étant appelé/hébergé dans MS Word. Pour fournir les valeurs de configuration de mon composant, j'ai créé winword.exe.config C:\Program Files\Microsoft Office\OFFICE11 dossier. Vous devriez être en mesure de lire les configurations de valeurs comme Vous le faites dans Traditionnel .NET.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X