我正在开发一个应用程序,我们已经基于多种原因决定应该加密app.config文件。我们使用SectionInformation.ProtectSection
和RsaProtectedConfigurationProvider
来加密所有部分。这部分工作正常,应用程序能够读取加密信息。我对这种方法的质疑是关于性能的。我遇到了一个问题负载测试我们的应用程序,其中使用加密配置在加载时几乎 2x 比使用未加密的配置。所以,当我的应用程序启动时,配置是否未加密并缓存在内存中?或者它实际上每次都进入磁盘?我已经做了很多搜索,并没有找到一个确切的答案来确定这里发生了什么。谢谢你的帮助!
我想补充一点,这个应用程序使用connectionString属性来访问数据库。
答案 0 :(得分:2)
我做了一个快速测试,看起来它被加载到内存中。下面是我运行的代码。在第一个WriteLine()之后,我打开配置,手动更改它,并保存配置文件。第二个WriteLine()打印出旧值而不是新值,因此我会得出结论,它在读取一次后不会打开文件。
static void Main(string[] args)
{
Console.WriteLine(ConfigurationManager.AppSettings("TestSettings"));
Console.ReadLine();
//Before hitting return I changed the value of TestSettings manually
Console.WriteLine(ConfigurationManager.AppSettings("TestSettings"));
Console.ReadLine();
}
答案 1 :(得分:0)
好的,我找到了自己问题的答案。事实证明,我使用加密配置所带来的性能损失与我们解决方案框架代码中的错误有关。基本上,每次我们访问连接字符串或任何应用程序设置时,都会留下我们想要实现的代码,这是从磁盘打开配置:
var config = ConfigurationManager.OpenMappedExeConfiguration()
我将此代码更改为仅使用ConfigurationManager.AppSettings[]
,现在一切正常。所以我发现的是ConfigurationManager
在您第一次访问属性时从磁盘读取,并且仅在第一次解密文件时。之后,它只是从内存中的解密部分读取值。
答案 2 :(得分:-1)