2010-11-02 16 views
5

Ich verwende OpenMappedExeConfiguration mit ExeConfigurationFileMap, um Konfigurationsdateien zu laden. Ihre Überlastungen deuten darauf hin, dass sie nur mit Dateinamen arbeiten. Gibt es eine Möglichkeit, eine Konfigurationsdatei aus einem Stream zu laden?Laden der Konfigurationsdatei aus dem Stream anstelle der Datei

Hintergrund: Ich möchte Konfigurationsdateien laden, die als eingebettete Ressourcen gespeichert sind. Es gibt keine Dateidarstellung!

Antwort

5

Nr. Das Problem ist, dass diese Klasse selbst die Konfiguration nicht lesen. Der Dateipfad selbst wird schließlich von der Klasse Configuration zum Laden der Konfiguration verwendet, und diese Klasse möchte tatsächlich einen physischen Pfad.

Ich denke, die einzige Lösung ist, die Datei auf einem temporären Pfad zu speichern und von dort zu lesen.

+1

Manchmal "Nein" ist die richtige Antwort :-) –

+0

Ein Auszug von http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx veranschaulicht die Notwendigkeit für einen "physischen" Pfad : "Die Konfigurationsklasseninstanz stellt die zusammengeführte Ansicht der Konfigurationseinstellungen aus allen Konfigurationsdateien dar, die für eine bestimmte physische Entität gelten" –

4

Ja. Wenn Ihre Anwendung Dateien im Anwendungsordner ändern darf - Update *.config Datei, durch Datei-IO-Operationen oder indem Sie "Abschnitt update/save/refresh". In dieser Lösung gibt es eine direkte Logik - Sie möchten eine Remote-Konfiguration haben? Holen Sie es von Remote, lokal aktualisieren und haben es.

Probe: auf „Überlast“ conf Konfiguration lassen sagen Sie Ihren wcf Abschnitt der Gruppe gespeichert haben (<bindings>, <behaviors> .. etc) in der Datei wcfsections.test.config (natürlich jede entfernte Quelle ist möglich) und wollen. Der Konfigurationsaktualisierungs-/Speicher-/Aktualisierungscode sieht dann wie folgt aus:

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

Hinweis: Die Aktualisierungsreihenfolge ist wichtig für das Subsystem zur Validierung von wcf. Wenn Sie es in falscher Reihenfolge aktualisieren, können Sie Validierungsausnahmen erhalten.

Verwandte Themen