写入app.config.Net中的自定义节



我在带有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;

用户名密码是指安装了SSRS报表服务器的服务器的登录信息,我从那里获取报表并通过客户端应用程序中的ReportViewer显示。

考虑到我不应该将app.config中的凭据保存为纯文本,我有两种方法来加密和解密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部分来保存凭据信息,因为我通过Property.Settings.Default.[PropertyName]在应用程序中多次使用凭据信息,因此不需要对所有信息进行加密和解密。

此外,我愿意接受任何其他想法,在这些想法中,我可以保存凭据,并能够在应用程序中对其进行加密和读取

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

  1. 在生产中,文件夹很可能是只读的
  2. 特别是ASP.Net,它使用应用程序监视文件夹内的任何更改,并在每次向web.config写入任何内容时回收AppPool。此外,每次向应用程序文件夹写入任何文件时都会发生这种情况

因此,要使所有这些工作正常进行,您应该创建一个单独的文件夹(不在您的web应用程序文件夹下),并在那里存储一个独立的配置。

为了在自定义位置打开配置,您应该使用如下代码:

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中映射的实际Web应用程序文件夹。您永远不应该在此处编写或更改应用程序代码中的任何文件,否则IIS将回收您的应用程序池

最新更新