【问题标题】:Performance issue with encrypted app.config file加密的 app.config 文件的性能问题
【发布时间】:2011-08-29 00:57:20
【问题描述】:

我正在开发一个应用程序,出于多种原因,我们决定对 app.config 文件进行加密。我们使用SectionInformation.ProtectSectionRsaProtectedConfigurationProvider 来加密所有部分。这部分工作正常,应用程序能够读取加密信息。我对这种方法的问题是关于性能的。我在负载测试我们的应用程序时遇到了问题,在负载下使用加密配置几乎比使用未加密配置慢 2x。那么当我的应用程序启动时,配置是否未加密并缓存在内存中?或者它实际上每次都进入磁盘?我做了很多搜索,但没有找到关于这里到底发生了什么的明确答案。感谢您的帮助!

我想补充一点,这个应用程序大量使用 connectionString 属性来访问数据库。

【问题讨论】:

    标签: c# encryption c#-4.0 app-config


    【解决方案1】:

    好的,我找到了自己问题的答案。事实证明,我对加密配置的性能影响与我们解决方案的框架代码中的一个错误有关。基本上,我们试图实现的东西留下了一些代码,每次我们访问连接字符串或任何应用程序设置时,它都会从磁盘打开配置:

    var config = ConfigurationManager.OpenMappedExeConfiguration()
    

    我将此代码更改为仅使用ConfigurationManager.AppSettings[],现在一切正常。所以我发现ConfigurationManager 在您第一次访问属性时从磁盘读取,并且只在第一次解密文件。之后它只是从内存中的解密部分读取值。

    【讨论】:

    • 所以实际上,我的回答是对的? “那么,当我的应用程序启动时,配置是否未加密并缓存在内存中?或者它实际上每次都进入磁盘?”......只是说
    【解决方案2】:

    【讨论】:

    • 谢谢你,但正如我提到的,我已经能够很好地加密我的 app.config 文件的部分。我没有注意到该帖子中的任何地方,但是其中提到了有关使用加密配置运行的应用程序性能的任何内容。
    【解决方案3】:

    我做了一个快速测试,看起来它已加载到内存中。下面是我运行的代码。在第一个 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();
    }
    

    【讨论】:

    • 谢谢,我也这么想。但是为什么我会在性能上受到如此大的打击,然后在配置中使用加密呢?它是否仍然可以在内存中加密,并且每次我需要访问它必须解密该部分的连接字符串?这是我很难找到的信息。
    • 是的,它可能是。如果您一遍又一遍地使用相同的设置,尽管我会将它们拉入一个变量。我尝试限制调用配置文件的次数。
    • 实际上我的下一个测试是自己缓存字符串,看看这是否有帮助。我想这只是您必须自己弄清楚的那些未记录的事情之一。再次感谢。我会更新我的测试结果,以防其他人遇到这个问题。我也会投票给你,但目前还不能这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2013-04-09
    • 2013-11-23
    • 2019-06-19
    • 2011-04-19
    • 2013-07-07
    相关资源
    最近更新 更多