我正在帮助构建一个带有多个自定义配置文件的 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;
}
}
}
我们像这样使用它:
CredentialsConfig credentialsConfig = new CredentialsConfig();
AdministratorConfigurationElement newConfig = credentialsConfig.GetConfigForUpdate().Administrator;
// setting attributes in the section's <administrator /> element
credentialsConfig.SaveConfig();
// frustrating app restart happens