2010-11-02 11 views
5

J'utilise OpenMappedExeConfiguration avec ExeConfigurationFileMap pour charger les fichiers de configuration. Leurs surcharges suggèrent qu'ils ne fonctionnent qu'avec des noms de fichiers. Existe-t-il un moyen de charger un fichier de configuration à partir d'un flux? Contexte: Je souhaite charger des fichiers de configuration stockés en tant que ressources incorporées. Il n'y a pas de représentation de fichier!Charger le fichier de configuration du flux au lieu du fichier

Répondre

5

N ° Le problème est que cette classe elle-même ne lit pas la configuration. Le chemin du fichier lui-même est finalement utilisé par la classe Configuration pour charger la configuration, et cette classe veut réellement un chemin physique.

Je pense que la seule solution est de stocker le fichier dans un chemin temporaire et de le lire à partir de là.

+1

Parfois, "Non" est la bonne réponse :-) –

+0

Un extrait de http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx illustre le besoin d'un chemin "physique" : "L'instance de classe Configuration représente la vue fusionnée des paramètres de configuration de tous les fichiers de configuration qui s'appliquent à une entité physique spécifique" –

4

Oui. Si votre application est autorisée à changer les fichiers dans le dossier de l'application - mettre à jour le fichier *.config, par des opérations d'E/S de fichier ou en faisant "section update/save/refresh". La logique est simple dans cette solution - voulez-vous avoir une configuration à distance? Obtenez-le à distance, mettez à jour local et l'avez.

Exemple: Disons que vous avez enregistré votre groupe de section WCF (<bindings>, <behaviors> .. etc) dans le fichier wcfsections.test.config (bien sûr une source distante est possible) et que vous souhaitez la configuration du fichier de configuration « surcharge ». Ensuite configration mise à jour/enregistrer/rafraichir le code ressemble à:

 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     ConfigurationSectionCollection sections = ServiceModelSectionGroup.GetSectionGroup(config).Sections; 
     sections.Clear(); 

     string fileName = ((GeneralSettings)ConfigurationManager.GetSection("generalSettings")).AppConfigServiceModelSectionFile; 

     XDocument doc = XDocument.Load(fileName); 
     var xmlGroup = (from x in doc.Descendants("system.serviceModel") select x).FirstOrDefault(); 

     string[] sectionsInUpdateOrder = { "bindings", "comContracts", "behaviors", "extensions", "services", "serviceHostingEnvironment", "client", "diagnostics" }; 
     foreach (string key in sectionsInUpdateOrder) 
     { 
      var e = (from x in xmlGroup.Elements(key) select x).FirstOrDefault(); 
      if (e != null) 
      { 
       ConfigurationSection currentSection = sections[e.Name.LocalName]; 
       string xml = e.ToString(); 
       currentSection.SectionInformation.SetRawXml(xml); 
      } 
     } 
     config.Save(); 
     foreach (string key in sectionsInUpdateOrder) 
      ConfigurationManager.RefreshSection("system.serviceModel/" + key); 

Note: l'ordre des mises à jour est important pour le sous-système de validation de WCF. Si vous le mettez à jour dans le mauvais ordre, vous pouvez obtenir des exceptions de validation.