写入app.config .Net中的自定义部分

时间:2012-03-21 07:48:11

标签: .net wpf c#-4.0 app-config

我在使用MVVM的WPF应用程序上使用.Net 4.0 我已将自定义部分 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();
            }
        } 
    }

我希望用户可以配置此userName和密码,以防更改报表服务器。因此,我将为用户提供一个界面,以提供该服务器的报表服务器名称,报表路径和凭据。我无法弄清楚将此用户提供的凭据写入此部分的方法是什么,并能够在运行时保存和刷新设置。

我不想使用 MyApp.Properties.Settings 部分保存凭据信息,因为我在我的应用中通过 Properties.Settings.Default使用了很多次。[ PropertyName] 并且不需要加密和解密所有信息。

此外,我愿意接受任何其他想法,我可以保存凭据,并能够加密并在我的应用程序中读取它。

1 个答案:

答案 0 :(得分:0)

您永远不应该写入位于app目录中的web.config或app.config。

  1. 最有可能是在制作中,该文件夹将是只读的。
  2. 特别是ASP.Net,使用应用程序监视文件夹内的任何更改,并在每次向web.config写入任何内容时回收AppPool。此外,每次将任何文件写入应用程序文件夹时都会发生这种情况。
  3. 因此,要使所有这些工作,您应该创建一个单独的文件夹(不在您的Web应用程序文件夹下),并在那里存储单独的配置。

    要在自定义位置打开配置,您应使用以下代码:

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

    此外,这是一个Web应用程序的示例文件夹结构:

    • C:\ YourApp - 应用程序的根目录。
    • C:\ YourApp \ Config - 自定义配置文件夹
    • C:\ YourApp \ Data - 用于某些用户生成数据的文件夹,例如上传的文件。
    • C:\ YourApp \ Web - 在IIS中映射的实际Web应用程序文件夹。您永远不应该从应用程序代码中写入或更改任何文件,否则IIS将回收您的应用程序池。