Написать в пользовательский раздел в app.config .Net - PullRequest
1 голос
/ 21 марта 2012

Я использую .Net 4.0 в приложении WPF с MVVM Я добавил пользовательский раздел MyAppCustom.ReportServer.Settings в группу разделов userSettings , как показано ниже:

<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b87a6a562548e011" >
  <section name="MyApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b87a6a562548e011" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
  <section name="MyAppCustom.ReportServer.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b87a6a562548e011" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>

<userSettings>
<MyApp.Properties.Settings>
  <setting name="Timezone" serializeAs="String">
    <value>Asia/Calcutta</value>
  </setting>
  <setting name="Language" serializeAs="String">
    <value>en_US</value>
  </setting>
  <setting name="SSO" serializeAs="String">
    <value>True</value>
  </setting>
  <setting name="LoginPeriod" serializeAs="String">
    <value>480</value>
  </setting>
  <setting name="FirstLaunch" serializeAs="String">
    <value>True</value>
  </setting>
  <setting name="IP" serializeAs="String">
    <value />
  </setting>
  <setting name="Port" serializeAs="String">
    <value />
  </setting>
  <setting name="ReportServer" serializeAs="String">
    <value>http://10.2.130.121/ReportServer</value>
  </setting>
  <setting name="Reports" serializeAs="String">
    <value>/MyReports/UserReport</value>
  </setting>
</BallyTech.UserMatrix.Properties.Settings>
<MyAppCustom.ReportServer.Settings>
  <setting name="UserName" serializeAs="String">
    <value>Administrator</value>
  </setting>
  <setting name="Password" serializeAs="String">
    <value>admin</value>
  </setting>
  <setting name="Domain" serializeAs="String">
    <value></value>
  </setting>
</BallyTech.UserMatrix.ReportServer.Settings>

Я читаю эти настройки следующим образом:

System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
System.Configuration.ClientSettingsSection configClient = ((System.Configuration.ClientSettingsSection)(config.GetSection("userSettings/MyAppCustom.ReportServer.Settings")));

string userName = configClient.Settings.Get("UserName").Value.ValueXml.InnerText;
string password = configClient.Settings.Get("Password").Value.ValueXml.InnerText;

userName и пароль относятся к информации для входа на сервер, на котором был установлен сервер отчетов SSRS , откуда я получаю отчеты и показываю их через ReportViewer в моем приложении на клиенте.

Учитывая, что я не должен сохранять учетные данные в моем app.config в виде простого текста, у меня есть 2 метода для шифрования и дешифрования разделов app.config:

public static void EncryptConfigSection(string sectionName)
    {
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ConfigurationSection configSection = config.GetSection(sectionName);
        if (configSection != null)
        {
            if (!configSection.SectionInformation.IsProtected)
            {
                if (!configSection.ElementInformation.IsLocked)
                {
                    configSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
                    configSection.SectionInformation.ForceSave = true;
                    config.Save(ConfigurationSaveMode.Full);
                }
            }
        }
    }

    public static void DecryptConfigSection(string sectionName)
    {
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ConfigurationSection configSection = config.GetSection(sectionName);
        if (configSection != null)
        {
            if (!(configSection.SectionInformation.IsLocked))
            {
                configSection.SectionInformation.UnprotectSection(); config.Save();
            }
        } 
    }

Я хочу, чтобы это имя пользователя и пароль настраивались пользователем в случае изменения сервера отчетов. Итак, я бы предоставил пользователю интерфейс для предоставления имени сервера отчетов, пути к отчету и учетных данных для этого сервера. Я не могу выяснить, каким образом можно было бы ввести предоставленные пользователем учетные данные в этот раздел, а также сохранить его и обновить настройки во время выполнения.

Я не хочу использовать раздел MyApp.Properties.Settings для сохранения информации о полномочиях, поскольку я часто использую ее в своем приложении через Properties.Settings.Default. [PropertyName ] и шифрование и дешифрование всей информации не требуется.

Кроме того, я открыт для любой альтернативной идеи, где я могу сохранить учетные данные и зашифровать их и прочитать в моем приложении.

1 Ответ

0 голосов
/ 21 марта 2012

Вы никогда не должны писать в web.config или app.config, который находится в каталоге вашего приложения.

  1. Скорее всего, в рабочей папке эта папка будет доступна только для чтения.
  2. ASP.Net, в частности, отслеживает любые изменения внутри папки с приложением и будет перезапускать AppPool каждый раз, когда вы что-нибудь пишете в web.config.Кроме того, это будет происходить каждый раз, когда вы записываете любой файл в папку вашего приложения.

Итак, чтобы все это работало, вы должны создать отдельную папку (не в папке вашего веб-приложения) и сохранитьтам отдельная конфигурация.

Чтобы открыть конфигурацию в пользовательском расположении, вы должны использовать код, подобный следующему:

var configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = "your full path to the config";
var customConfig = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);

Кроме того, вот пример структуры папок для веб-приложения:

  • C: \ YourApp - корень приложения.
  • C: \ YourApp \ Config - папка для пользовательских настроек
  • C: \ YourApp \ Data - папка для некоторого пользователя-генерированные данные, например, загруженные файлы.
  • C: \ YourApp \ Web - фактическая папка веб-приложения, сопоставленная в IIS.Вам никогда не следует писать или изменять здесь какие-либо файлы из кода приложения, иначе IIS перезапустит пул приложений.
...