保存加密配置部分时阻止IIS应用重启?

acz*_*ski 3 c# asp.net iis encryption configuration-files

我正在帮助构建具有多个自定义配置文件的ASP.NET C#应用程序.我们web.config使用<configSections><section /></configSections>确保设置的元素将这些元素存储在文件外部,restartOnExternalChanges="false"因此文件保存不会重新启动应用程序.

为了管理这些设置,我们构建了ASPX页面来读取,更新和保存各个部分和值.对于纯文本部分,这非常有效.管理员登录应用程序的配置部分,进行更改,保存并立即生效.

但是我们在其自己的外部文件中有一个部分,就像所有其他部分一样,也是加密的.无论何时保存该部分,IIS应用程序都会重新启动会话.这意味着登录管理员进行配置更改,并且所有登录到应用程序用户端的最终用户都必须再次登录,这令人沮丧.

有没有办法在保存加密配置节时避免IIS应用程序重启?

我们当前的加密配置部分处理代码如下所示:

public class CredentialsConfig : ConfigurationSection
{
    Configuration Config = null;
    CredentialsConfig Section = null;

    public static CredentialsConfig GetConfig()
    {
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        CredentialsConfig section = config.GetSection("credentials") as CredentialsConfig;

        // Ensure the current file is encrypted
        if (!section.SectionInformation.IsProtected)
        {
            section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
            section.SectionInformation.ForceSave = true;
            config.Save();
        }

        return section;
    }

    public CredentialsConfig GetConfigForUpdate()
    {
        Config = WebConfigurationManager.OpenWebConfiguration("~");
        Section = Config.GetSection("credentials") as CredentialsConfig;
        return Section;
    }

    public void SaveConfig()
    {
        Section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
        Section.SectionInformation.ForceSave = true;
        Config.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("credentials");
    }

    [ConfigurationProperty("administrator")]
    public AdministratorConfigurationElement Administrator
    {
        get
        {
            return this["administrator"] as AdministratorConfigurationElement;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们正在使用它:

CredentialsConfig credentialsConfig = new CredentialsConfig();
AdministratorConfigurationElement newConfig = credentialsConfig.GetConfigForUpdate().Administrator;
// setting attributes in the section's <administrator /> element
credentialsConfig.SaveConfig();
// frustrating app restart happens
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 5

否.对.config文件的修改是始终重新启动应用程序的自动触发器之一.

就个人而言,我建议将.config文件中的常用修改项目移入数据库或注册表,或者可以加密和保护的其他地方,以及这不是问题.