#c# #encryption #c#-4.0 #app-config
#c# #шифрование #c #-4.0 #app-config
Вопрос:
я работаю над приложением, в котором по ряду причин мы решили, что файл app.config должен быть зашифрован. Мы используем SectionInformation.ProtectSection
с RsaProtectedConfigurationProvider
для шифрования всех разделов. Эта часть работает нормально, и приложение может считывать зашифрованную информацию. Мой вопрос при таком подходе касается производительности. Я столкнулся с проблемой при нагрузочном тестировании нашего приложения, когда использование зашифрованной конфигурации происходит почти в 2 раза медленнее при загрузке, чем с незашифрованной конфигурацией. Итак, при запуске моего приложения конфигурация становится незашифрованной и кэшируется в памяти или нет? Или он действительно отправляется на диск каждый раз? Я провел много поисков и не нашел точного ответа на то, что именно здесь происходит. Спасибо за вашу помощь!
Я хотел бы добавить, что это приложение часто использует свойство ConnectionString для доступа к базе данных.
Ответ №1:
Я провел быстрый тест, и похоже, что он загружен в память. Ниже приведен код, который я запустил. После первой строки записи () Я открыл конфигурацию, вручную изменил ее и сохранил файл конфигурации. Вторая строка записи () распечатала старое значение, а не новое, поэтому я бы сделал вывод, что она не открывает файл обратно после того, как прочитает его один раз.
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. Спасибо, я тоже так подумал. Но почему я получаю такое снижение производительности, а затем использую шифрование в конфигурации? Может ли он все еще быть зашифрован в памяти, и каждый раз, когда мне нужно получить доступ к строке подключения, он должен расшифровывать раздел? Это информация, которую мне трудно найти.
2. Да, это может быть. Если вы снова и снова нажимаете на одни и те же настройки, я бы просто перенес их в переменную. Я пытаюсь ограничить количество обращений к файлу конфигурации.
3. На самом деле мой следующий тест должен был заключаться в том, чтобы самому кэшировать строку и посмотреть, поможет ли это. Я думаю, это всего лишь одна из тех недокументированных вещей, с которыми вы должны разобраться сами. Еще раз спасибо. Я обновлю результаты моего теста на случай, если кто-нибудь еще столкнется с этим. Я бы тоже проголосовал за вас, но пока не могу этого сделать.
Ответ №2:
Хорошо, я нашел ответ на свой собственный вопрос. Как оказалось, снижение производительности, которое я испытывал с зашифрованной конфигурацией, было связано с ошибкой в коде фреймворка нашего решения. По сути, остался избыточный код от того, что мы пытались реализовать, который открывал конфигурацию с диска каждый раз, когда мы обращались к строке подключения или любому параметру приложения:
var config = ConfigurationManager.OpenMappedExeConfiguration()
Я изменил этот код на just use ConfigurationManager.AppSettings[]
, и теперь все работает отлично. Итак, я выяснил, что ConfigurationManager
считывается с диска при первом обращении к свойству, а также расшифровывает файл только при первом обращении. После этого он просто считывает значения из расшифрованных разделов в памяти.
Комментарии:
1. Итак, на самом деле, мой ответ был правильным? «Итак, при запуске моего приложения конфигурация становится незашифрованной и кэшируется в памяти или нет? Или он действительно отправляется на диск каждый раз?»… просто говорю
Ответ №3:
Вы можете попробовать следующее:
трудно превзойти эту производительность
Комментарии:
1. Спасибо за это, но, как я упоминал, я уже могу отлично зашифровать разделы моего файла app.config. Однако я нигде в этом сообщении не заметил, чтобы в нем упоминалось что-либо о производительности запущенного приложения с зашифрованной конфигурацией.