2015-01-02 27 views
0

當我嘗試訪問已加密,無法正確解密配置部分(例如,有人剛剛從另一臺機器上抓起配置文件盲目) - Configuration類拋出異常。在這種情況下,我想抓住這種情況並完全重寫該部分。覆蓋加密配置部分而不解密?

我試着刪除和添加回有問題的部分,但似乎去除被忽略 - 在「追趕」第二條語句拋出約等部分其他異常已經存在:

try 
{ 
    // this getter might throw an exception - e.g. if encrypted on another machine 
    var connStrings = config.ConnectionStrings; 
} 
catch (ConfigurationException) 
{ 
    config.Sections.Remove("connectionStrings"); 
    config.Sections.Add("connectionStrings", new ConnectionStringsSection()); 
} 

它可能與事實我有connectionStrings部分居住在單獨的文件,即我的配置文件有類似<connectionStrings configSource="connections.config"/>,而實際的加密內容在connections.config文件中。

是否有可能做什麼,我需要在沒有回落到直接XML操作,僅使用.NET配置類?

回答

1

我很確定這會做你想做的。就我而言,我只是包括了假的connectionString設置:

<connectionStrings> 
    <add connectionString="foo"/> 
</connectionStrings> 

我並沒有包括「名稱」屬性,所以想讀的ConnectionStrings將炸燬,就像你的情況:

try { 
    var x = ConfigurationManager.ConnectionStrings; //blows up    
} 
catch { 
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
    config.Sections.Remove("connectionStrings"); 
    config.Save(); //Now save the changes 
    ConfigurationManager.RefreshSection("connectionStrings"); //and reload the section 
    var x = ConfigurationManager.ConnectionStrings; //can now read!     
} 

你仍然無法做到這一點:

config.Sections.Add("connectionStrings", new ConnectionStringsSection()); 

因爲(至少在我的機器上),它拿起從Machine.config中的ConnectionStrings。

我懷疑在你的情況下,這很好。如果你願意的話,現在你可以添加自己的連接字符串,而且你並不需要完全放棄連接字符串部分。

+0

謝謝!實際上,我忘記了connectionStrings也是從機器配置中拉出來的。否則我的'config.Sections.Remove(「connectionStrings」);'工作得很好。沒有必要保存一次或刷新。至少,在我的情況下,它沒有這些線。但是,無論如何,謝謝你的回答,讓我走向正確的道路:) –

+0

哦。奇怪的。是的,在我的情況下,我*確實需要這兩行。 – aquinas

+0

在我的情況下,它不是一個運行應用程序的配置,只是通過'ConfigurationManager.OpenExeConfiguration(executablePath)'加載其他exe文件。也許這就是原因... –