2010-11-02 56 views
5

我使用OpenMappedExeConfiguration和ExeConfigurationFileMap加載配置文件。它們的超載表明它們只能處理文件名。有沒有辦法從流中加載配置文件?從流而不是文件加載配置文件

背景:我想加載存儲爲嵌入式資源的配置文件。沒有文件表示!

回答

5

問題是這個類本身不讀配置。文件路徑本身最終被類加載配置使用,而這個類實際上需要一個物理路徑。

我認爲唯一的解決方案是將文件存儲到臨時路徑,並從那裏讀取它。

+1

有時候「否」是正確答案:-) – 2010-11-08 09:54:00

+0

http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx摘錄說明需要一個「物理」路徑:「Configuration類實例表示來自適用於特定物理實體的所有配置文件的配置設置的合併視圖」 – 2010-11-08 09:54:19

4

是的。如果您的應用程序被允許更改應用程序文件夾中的文件 - 更新*.config文件,通過文件IO操作或通過執行「部分update/save/refresh」。在這個解決方案中有直接的邏輯 - 想要遠程配置?從遠程獲取它,更新本地並擁有它。

樣品:讓說你已經存儲在您的WCF節的組(<bindings><behaviors> ..等)的文件wcfsections.test.config(當然任何遠程源可能),並希望「過載」的conf文件的配置。然後,配置更新/保存/刷新代碼如下所示:

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

注意:更新順序對於wcf驗證子系統很重要。如果您以錯誤的順序更新它,則可能會得到驗證異常。

相關問題