我有这个方法从我的XML"自定义配置"填充对象。配置文件:
public static BindingList<StationConfiguration> GetStationsFromConfigFile()
{
string xmlDocumentText = File.ReadAllText(GetConfigFilePath());
var doc = new XmlDocument();
doc.LoadXml(xmlDocumentText);
BindingList<StationConfiguration> stations = new BindingList<StationConfiguration>();
foreach (XmlNode node in doc.DocumentElement["StationsSection"].ChildNodes[0].ChildNodes)
{
stations.Add(
new StationConfiguration(
node.Attributes["Comment"].Value
, node.Attributes["FtpUsername"].Value
, node.Attributes["FtpPassword"].Value
, node.Attributes["DestinationFolderPath"].Value
));
}
return stations;
}
如您所见,我使用File.ReadAllText
将XML配置文件的内容拉入字符串。
这一切都适用于非加密配置文件。但现在我需要加密它。 MSDN suggests这样做的方式是这样的:
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None);
(顺便说一句,当我查看config.FilePath
属性时,它会向我显示XML配置文件的正确路径,只是因为一些奇怪的原因而需要额外的&#34; .config&#34;扩展。结束了&#34; .exe.config。 config &#34;出于某种奇怪的原因。但我离题...... )
这是我的StationConfigurationSection
课程:
public class StationConfigurationSection : ConfigurationSection
{
[ConfigurationProperty("Stations", IsDefaultCollection = false)]
[ConfigurationCollection(typeof(StationCollection),
AddItemName = "add",
ClearItemsName = "clear",
RemoveItemName = "remove")]
public StationCollection Stations
{
get
{
return (StationCollection)base["Stations"];
}
}
public override bool IsReadOnly()
{
return false;
}
}
我的完整XML配置文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="StationsSection" type="EcFtpClient.StationConfigurationSection, EcFtpClient" />
</configSections>
<StationsSection>
<Stations>
<add Comment="ABC" FtpUsername="eliezer" FtpPassword="secret" DestinationFolderPath="C:\Users\eliezer\Desktop\local dest" FtpTimeoutInSeconds="30" FtpHostname="ftp://192.168.1.100/" FtpFolderPath="" />
</Stations>
</StationsSection>
<startup>
<supportedRuntime version="v2.0.50727" />
</startup>
<appSettings>
<add key="NameOfService" value="ECClient" />
<add key="PollingFrequencyInSeconds" value="60" />
</appSettings>
</configuration>
我想使用MSDN System.Configuration
方法,因为它使得en / de-cryption非常容易,但我怎样才能将他们的方法与我的方法相结合呢?
- 更新 -
我已经获得了该文件的加载,但在保存文件时仍然卡住了。
我已经将加载方法(在这个问题的最顶部)更改为:
public static BindingList<StationConfiguration> GetStationsFromConfigFile()
{
Configuration config = ConfigurationManager.OpenExeConfiguration(GetConfigFilePath());
StationConfigurationSection stationsConfig = (StationConfigurationSection)config.GetSection("StationsSection");
var stationCollection = ((StationCollection)stationsConfig.Stations);
BindingList<StationConfiguration> stationsToReturn = new BindingList<StationConfiguration>();
for (int index = 0; index < stationCollection.Count; index++)
{
stationsToReturn.Add(
new StationConfiguration(
stationCollection[index].Comment,
stationCollection[index].FtpUsername,
stationCollection[index].FtpPassword,
stationCollection[index].DestinationFolderPath)
);
return stationsToReturn;
}
我得到的是加载文件的能力,无论它是否加密 - 它都能成功加载。太棒了。
但我仍然不确定如何保存工作。这是我的保存方法:
public static void SaveStationsToConfigFile(BindingList<StationConfiguration> updatedStations, bool isConfigToBeEncrypted)
{
string configFilePath = GetConfigFilePath();
var xDoc = XDocument.Load(configFilePath);
var xDeclaration = xDoc.Declaration;
var xElement = xDoc.XPathSelectElement("//StationsSection/Stations");
// clear out existing station configurations
xDoc.Descendants("Stations").Nodes().Remove();
foreach (var station in updatedStations)
{
xElement.Add(new XElement("add",
new XAttribute("Comment", station.Station),
new XAttribute("FtpUsername", station.Username),
new XAttribute("FtpPassword", station.Password),
new XAttribute("DestinationFolderPath", station.FolderName),
new XAttribute("FtpTimeoutInSeconds", 30),
new XAttribute("FtpHostname", GetEnvironmentAppropriateFtpHostName()),
new XAttribute("FtpFolderPath", GetEnvironmentAppropriateFtpFolderPath())
));
}
xDoc.Declaration = xDeclaration;
xDoc.Save(configFilePath);
}
为了使用保护/加密来保存它,我需要做这样的事情 - 换句话说,使用System.Configuration.Configuration
对象:
stationsConfig.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
stationsConfig.SectionInformation.ForceSave = true;
objConfig.Save(ConfigurationSaveMode.Modified);
但我目前仍在使用XDocument.Save
进行保存...
有没有办法将我的XDocument转换为System.Configuration.Configuration
兼容对象?
想到的黑客攻击是在通话之后到XDocument.Save
- 加载并使用System.Configuration.Configuration
内容再次保存。但这是一个黑客...
答案 0 :(得分:0)
我相信你必须和configuration settings framework一起玩。您需要创建 ConfigurationSection 的后代,而不是尝试自己打开xml文件。
这样它就会从加密配置中读取和写入。
看起来你已经开始了这条路线(EcFtpClient.StationConfigurationSection
),但你没有包含任何代码。