我正在使用C#,Framework 3.5(VS 2008).
我正在使用将ConfigurationManager配置(而不是默认的app.config文件)加载到Configuration对象中.
使用Configuration类,我能够得到一个ConfigurationSection,但我找不到获取该部分值的方法.
在配置中,ConfigurationSection是类型System.Configuration.NameValueSectionHandler.
对于什么是价值,当我使用的方法GetSection的ConfigurationManager(只能当它是对我的默认app.config文件),我收到了一个对象类型,我可以投进去对键值的集合,我刚刚收到像字典一样的价值.但是,当我ConfigurationSection从Configuration类接收类时,我无法进行此类转换.
编辑:配置文件的示例:
<configuration>
<configSections>
<section name="MyParams"
type="System.Configuration.NameValueSectionHandler" />
</configSections>
<MyParams>
<add key="FirstParam" value="One"/>
<add key="SecondParam" value="Two"/>
</MyParams>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我在app.config上使用它时的方式示例("GetSection"方法仅适用于默认的app.config):
NameValueCollection myParamsCollection =
(NameValueCollection)ConfigurationManager.GetSection("MyParams");
Console.WriteLine(myParamsCollection["FirstParam"]);
Console.WriteLine(myParamsCollection["SecondParam"]);
Run Code Online (Sandbox Code Playgroud) 我想使用我的应用程序配置存储2个公司的设置,我更喜欢是否可以使用一个部分来分隔另一个的数据而不是给它们不同的密钥名称.
我一直在网上查看,但当人们使用部分或找到过时的简单方法来使用它时,我似乎有点不知所措.有人可以通过我的初学者指南吗?
下面是我的app.config的示例:
<configSections>
<section name="FBI" type="" />
<section name="FSCS" type="" />
</configSections>
<FSCS>
<add key="processingDirectory" value="C:\testfiles\ProccesFolder"/>
</FSCS>
<FBI>
<add key="processingDirectory" value="C:\testfiles\ProccesFolder"/>
</FBI>
Run Code Online (Sandbox Code Playgroud)
更新:
基于anwer的高级解决方案.如果有人想知道.
App.config中:
<configuration>
<configSections>
<sectionGroup name="FileCheckerConfigGroup">
<section name="FBI" type="System.Configuration.NameValueSectionHandler" />
<section name="FSCS" type="System.Configuration.NameValueSectionHandler" />
</sectionGroup>
</configSections>
<FileCheckerConfigGroup>
<FSCS>
<add key="processingDirectory" value="C:\testfiles\ProccesFolder"/>
</FSCS>
<FBI>
<add key="processingDirectory" value="C:\testfiles\ProccesFolder"/>
</FBI>
</FileCheckerConfigGroup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
码:
// Get the application configuration file.
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
// Get the collection of the section groups.
ConfigurationSectionGroupCollection sectionGroups = config.SectionGroups;
foreach (ConfigurationSectionGroup sectionGroup in …Run Code Online (Sandbox Code Playgroud) 我已经使用XSD创建了自定义配置部分.为了解析这个新模式之后的配置文件,我加载了资源(我的.xsd文件):
public partial class MonitoringConfiguration
{
public const string ConfigXsd = "MonitoringAPI.Configuration.MonitoringConfiguration.xsd";
public const string ConfigSchema = "urn:MonitoringConfiguration-1.0";
private static XmlSchemaSet xmlSchemaSet;
static MonitoringConfiguration()
{
xmlSchemaSet = new XmlSchemaSet();
Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
XmlReader schemaReader = XmlReader.Create(xsdStream);
xmlSchemaSet.Add(ConfigSchema, schemaReader);
}
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我的资源是:MonitoringConfiguration.xsd.而另一个部分类的名称空间(表示.xsd文件背后的代码)是MonitoringAPI.Configuration.
问题出在这里:
Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
Run Code Online (Sandbox Code Playgroud)
xsdStream为null,所以我猜想无法找到资源!但为什么?
谢谢
在Web应用程序中,我希望能够使用如下配置部分定义一些映射:
<configuration>
<configSections>
<sectionGroup name="MyCustomer">
<section name="CatalogMappings" type="MyCustom.MyConfigSection" />
</sectionGroup>
</configSections>
<MyCustomer>
<catalogMappings>
<catalog name="toto">
<mapping value="1" displayText="titi" />
<mapping value="2" displayText="tata" />
</catalog>
<catalog name="toto2">
<mapping value="1" displayText="titi2" />
<mapping value="2" displayText="tata2" />
</catalog>
</catalogMappings>
</MyCustomer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我正在努力实现这一目标,特别是在定义我的集合集合时.为实现这一目标,我需要实现哪些类?
目前,我有:
public class CatalogMappingSection : System.Configuration.ConfigurationSection
{
public class Mapping : ConfigurationElement
{
[ConfigurationProperty("externalKey")]
public string ExternalKey { get; set; }
[ConfigurationProperty("displayText", IsRequired=true)]
public string DisplayText { get; set; }
[ConfigurationProperty("value", IsRequired=true, IsKey=true)]
public int Value { get; set; }
} …Run Code Online (Sandbox Code Playgroud) 看来,ConfigurationElement中TimeSpan无法处理超过23:59:59较大的值.有没有解决方法?是继承TimeSpan,并使一个新的TimeSpanValidatorAttribute甚至上班?我需要处理从几分钟到几天的时间跨度.
我正在使用以下配置部分
[ConfigurationProperty("SequenceRolloverDOSCompare", IsRequired = true)]
[TimeSpanValidator(MinValueString = "0:0:00", MaxValueString = 10675199.02:48:05.4775807", ExcludeRange = false)]
public TimeSpan SequenceRolloverDOSCompare
{
get
{
return (TimeSpan)base["SequenceRolloverDOSCompare"];
}
}
Run Code Online (Sandbox Code Playgroud)
配置看起来像这样:
<SequenceRolloverPolling SequenceRolloverDOSCompare="2:00:00:00" />
Run Code Online (Sandbox Code Playgroud)
给 ConfigurationErrorsException : The value of the property 'SequenceRolloverDOSCompare' cannot be parsed. The error is: 2:00:00:00 is not a valid value for TimeSpan.
或这个:
<SequenceRolloverPolling SequenceRolloverDOSCompare="48:00:00" />
Run Code Online (Sandbox Code Playgroud)
给 OverflowException : The TimeSpan could not be parsed because at least one of the hours, …
过去3天我一直在网上搜索,但找不到任何关于这个问题的提法.我已经创建了一个自定义配置类,可以与我的app.config一起使用.一切正常.当不需要配置属性(配置元素)并且未在app.config中定义时,会出现此问题.似乎为配置属性返回默认值.有谁知道如何确定app.config中是否未定义该属性?(我一直试图发布我的app.config,但无法弄清楚如何做到这一点......谁知道怎么做?)
//Main
namespace TestStub
{
class Program
{
static void Main(string[] args)
{
CustomSettingsHandler config = (CustomSettingsHandler)ConfigurationManager.GetSection("CustomSettingsManager");
Console.WriteLine("Setting1 {0}", config.Setting1.CustomSettingItem);
Console.WriteLine("Setting2 {0}", config.Setting2.CustomSettingItem);
}
}
}
//Custom Configuration Class
namespace CustomConfiguration
{
public class CustomSettingsHandler : ConfigurationSection
{
[ConfigurationProperty("setting1", IsRequired = false)]
public CustomSettingElement Setting1 { get { return (CustomSettingElement)this["setting1"]; } }
[ConfigurationProperty("setting2", IsRequired = false)]
public CustomSettingElement Setting2 { get { return (CustomSettingElement)this["setting2"]; } }
}
public class CustomSettingElement : ConfigurationElement
{
[ConfigurationProperty("customsettingitem", IsRequired = false)]
public int CustomSettingItem …Run Code Online (Sandbox Code Playgroud) 我使用IConfigurationSectionHandler接口来获取有关我的自定义配置部分的信息.但它已被弃用,我想改用ConfigurationSection.
如何使用此视图创建自定义ConfigurationSection并使用ConfigurationSection而不是IConfigurationSectionHandler:
<CustomSectionBlaBla>
<Parent name="DB">
<FirstChild value="someValue"/>
<SecondChild value="someValue"/>
<Parent/>
...
<Parent name="UI">
<FirstChild value="someValue"/>
<SecondChild value="someValue"/>
<Parent/>
<CustomSectionBlaBla/>
Run Code Online (Sandbox Code Playgroud) 这是我的想法:
我希望一个小的可执行文件有一个app.config文件,其中有多个部分位于sectionGroup"applicationSettings"下(不是"appSettings",我不需要写入该文件).每个部分都有一个名称,对应于一个应该加载的模块.
这是一个例子:
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="Executable" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="FirstModule" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<Executable>
<setting name="MyFirstSetting" serializeAs="String">
<value>My awesome feature setting</value>
</setting>
</Executable>
<FirstModule path="path to the modules assembly">
<setting name="ImportantSettingToTheModule" serializeAs="String">
<value>Some important string</value>
</setting>
</FirstModule>
</applicationSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
现在,如果我定义FirstModule部分,我希望我的应用程序加载其程序集.如果未定义该部分,则不应加载该模块.这不仅适用于一个模块,也适用于尚未定义的模块.
所以我基本上需要在运行时找出已定义的部分.我该怎么办?
此外,我希望它成为一个可移植的可执行文件(=它也必须在Mono上运行),它向后兼容.NET 2.0.
看看GitHub上的项目(目前在此提交中)可能会很有趣.
我有一个控制台应用程序试图从web.config文件加载CustomConfigurationSection.
自定义配置部分具有所需的自定义配置元素.这意味着当我加载配置部分时,如果配置中不存在该配置元素,我希望看到异常.问题是.NET框架似乎完全忽略了isRequired属性.因此,当我加载配置部分时,我只创建自定义配置元素的实例并将其设置在配置部分.
我的问题是,为什么会发生这种情况?我希望GetSection()方法触发ConfigurationErrors异常,因为配置中缺少必需的元素.
以下是我的配置部分的外观.
public class MyConfigSection : ConfigurationSection
{
[ConfigurationProperty("MyConfigElement", IsRequired = true)]
public MyConfigElement MyElement
{
get { return (MyConfigElement) this["MyConfigElement"]; }
}
}
public class MyConfigElement : ConfigurationElement
{
[ConfigurationProperty("MyAttribute", IsRequired = true)]
public string MyAttribute
{
get { return this["MyAttribute"].ToString(); }
}
}
Run Code Online (Sandbox Code Playgroud)
这是我加载配置部分的方法.
class Program
{
public static Configuration OpenConfigFile(string configPath)
{
var configFile = new FileInfo(configPath);
var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name);
var wcfm = new WebConfigurationFileMap();
wcfm.VirtualDirectories.Add("/", vdm);
return WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");
} …Run Code Online (Sandbox Code Playgroud) c# configuration configurationsection configurationelement webconfigurationmanager
我想在程序中读/写(并保存)应用程序的配置文件
app.config是这样的:
<configuration>
<configSections>
<section name="AdWordsApi" type="System.Configuration.DictionarySectionHandler" requirePermission="false"/>
</configSections>
<AdWordsApi>
<add key="LogPath" value=".\Logs\"/>
...
</AdWordsApi>
</configuration>
Run Code Online (Sandbox Code Playgroud)
当我使用ConfigurationManager.GetSection读取app.config时,它可以工作:
var adwords_section = (System.Collections.Hashtable) System.Configuration.ConfigurationManager.GetSection("AdWordsApi");
Console.WriteLine((string)adwords_section["LogPath"]);
Run Code Online (Sandbox Code Playgroud)
但是当我使用ConfigurationManager.OpenExeConfiguration时:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
ConfigurationSection section = config.GetSection("AdWordsApi");
Console.WriteLine(section["LogPath"]);
Run Code Online (Sandbox Code Playgroud)
我总是得到这个错误:
由于其保护级别,'System.Configuration.ConfigurationElement.this [System.Configuration.ConfigurationProperty]'无法访问
但据我所知,GetSection无法在程序运行时保存配置,就像我在开头说的那样:我想在程序运行时保存配置,所以我必须使用OpenExeConfiguration.
我已经google了很长时间,我发现使用AppSettings,但我使用的是自定义部分..
任何人都可以解释为什么会出现"ConfigurationProperty无法访问"错误?谢谢
编辑:
我已复制本地的系统和System.Configuration至真
.net c# configurationmanager app-config configurationsection