2010-11-02 13 views
5

Utilizo OpenMappedExeConfiguration con ExeConfigurationFileMap para cargar archivos de configuración. Sus sobrecargas sugieren que solo funcionan con nombres de archivos. ¿Hay alguna forma de cargar un archivo de configuración desde una transmisión?Cargar archivo de configuración desde la secuencia en lugar del archivo

Antecedentes: deseo cargar los archivos de configuración que se almacenan como recursos incrustados. ¡No hay representación de archivos!

Respuesta

5

No. El problema es que esta clase en sí no lee la configuración. La ruta del archivo en sí es utilizada finalmente por la clase Configuration para cargar la configuración, y esta clase en realidad quiere una ruta física.

Creo que la única solución es almacenar el archivo en una ruta temporal y leerlo desde allí.

+1

A veces "No" es la respuesta correcta :-) –

+0

Un extracto de http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx ilustra la necesidad de una ruta "física" : "La instancia de clase de configuración representa la vista combinada de la configuración de todos los archivos de configuración que se aplican a una entidad física específica" –

4

Sí. Si su aplicación tiene permiso para cambiar archivos en la carpeta de la aplicación - actualice el archivo *.config, por operaciones de IO de archivo o haciendo "sección update/save/refresh". Esta solución tiene una lógica directa: ¿quiere tener una configuración remota? Obténgalo desde el control remoto, actualice local y tenerlo.

muestra: Digamos que usted ha almacenado el grupo de su sección de WCF (<bindings>, <behaviors> .. etc) en el archivo wcfsections.test.config (por supuesto, cualquier fuente remota es posible) y quiere configuración conf "sobrecarga". A continuación, la actualización configration/guardar/actualizar el código se parece a:

 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); 

Nota: el orden de las actualizaciones es importante para el subsistema de validación WCF. Si lo actualiza en orden incorrecto, puede obtener excepciones de validación.

Cuestiones relacionadas