在不解密的情况下覆盖加密的配置部分?

Overwrite encrypted configuration section without decrypting?

当我尝试访问已加密且无法正确解密的配置部分时(例如,有人只是盲目地从另一台机器上获取配置文件)- Configuration class 抛出异常。我想抓住这种情况并在这种情况下完全重写该部分。

我试图删除并重新添加有问题的部分,但删除似乎被忽略了 - 'catch' 中的第二个语句抛出另一个关于该部分已经存在的异常:

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 文件中。

是否可以仅通过使用 .NET 配置 classes 来完成我需要的操作,而无需退回到直接 XML 操作?

我很确定这会满足您的要求。就我而言,我只是包含了一个虚假的 connectionString 设置:

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

我没有包含 "name" 属性,因此尝试读取 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。

我怀疑你的情况没问题。现在,您可以根据需要添加自己的连接字符串,而实际上并不需要完全取消连接字符串部分。