我在使用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] 并且不需要加密和解密所有信息。
此外,我愿意接受任何其他想法,我可以保存凭据,并能够加密并在我的应用程序中读取它。
答案 0 :(得分:0)
您永远不应该写入位于app目录中的web.config或app.config。
因此,要使所有这些工作,您应该创建一个单独的文件夹(不在您的Web应用程序文件夹下),并在那里存储单独的配置。
要在自定义位置打开配置,您应使用以下代码:
var configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = "your full path to the config";
var customConfig = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
此外,这是一个Web应用程序的示例文件夹结构: