Reputation: 1742
My XML looks like this and the filename is web.config
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="configFile" value="IIS.config"/>
<add key="RialtoDomain" value="ASNC_AUDITORS"/>
</appSettings>
<system.serviceModel>
....
</system.serviceModel>
</configuration>
In the code when I read like this
String path = ConfigurationSettings.AppSettings["configFile"];
I am getting a null value. No exception is thrown. Is this the right way to do it?
Upvotes: 107
Views: 138444
Reputation: 551
You can also convert your appSetting section to a variable that you can inject in any constructors.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="MyValue1" value="MyString"
<add key="MyValue2" value="600"
<add key="MyValue3" value="https://stackoverflow.com/"
</appSettings>
</configuration>
Declare an class as bellow:
public class AppSettings
{
public string MyValue1 { get; set; }
public int MyValue2 { get; set; }
public Uri MyValue3 { get; set;}
}
Declare the extension function ToVariable() in a new static class as bellow:
public static class ObjectExtension
{
public static T ToVariable<T>(this object data) where T : class, new()
{
if (data is NameValueCollection dataCollection)
{
var target = new T();
var targetProperties = target.GetType()?.GetProperties() ;
foreach(string key in dataCollection.AllKeys)
{
var property = targetProperties.FirstOrDefault(x => x.Name.Equals(key, System.StringComparison.InvariantCultureIgnoreCase));
if (property != null)
{
switch (Type.GetTypeCode(property.PropertyType))
{
case TypeCode.String:
property.SetValue(target, dataCollection[key], null);
break;
case TypeCode.Int32:
property.SetValue(target, Int32.Parse(dataCollection[key].ToString()), null);
break;
case TypeCode.Object:
switch (property.PropertyType.Name)
{
case nameof(Uri):
property.SetValue(target, new Uri(dataCollection[key].ToString()), null);
break;
default: throw new NotImplementedException($"The Object type [{property.PropertyType.Name}] is not implemented for the property [{property.Name}]");
}
break;
default:
throw new NotImplementedException($"The Type [{property.PropertyType}] is not implemented for the property [{property.Name}]");
}
}
}
return target;
}
return default(T);
}
}
And finally you can use it in your Global.asax or OWIN Startup class as bellow:
var appSettings = ConfigurationManager.GetSection("appSettings").ToVariable<AppSettings>();
Upvotes: 0
Reputation: 2403
Here's the easy way to get access to the web.config settings anywhere in your C# project.
Properties.Settings.Default
Use case:
litBodyText.Text = Properties.Settings.Default.BodyText;
litFootText.Text = Properties.Settings.Default.FooterText;
litHeadText.Text = Properties.Settings.Default.HeaderText;
Web.config file:
<applicationSettings>
<myWebSite.Properties.Settings>
<setting name="BodyText" serializeAs="String">
<value>
<h1>Hello World</h1>
<p>
Ipsum Lorem
</p>
</value>
</setting>
<setting name="HeaderText" serializeAs="String">
My header text
<value />
</setting>
<setting name="FooterText" serializeAs="String">
My footer text
<value />
</setting>
</myWebSite.Properties.Settings>
</applicationSettings>
No need for special routines - everything is right there already. I'm surprised that no one has this answer for the best way to read settings from your web.config file.
Upvotes: 1
Reputation: 511
using System.Configuration;
/// <summary>
/// For read one setting
/// </summary>
/// <param name="key">Key correspondent a your setting</param>
/// <returns>Return the String contains the value to setting</returns>
public string ReadSetting(string key)
{
var appSettings = ConfigurationManager.AppSettings;
return appSettings[key] ?? string.Empty;
}
/// <summary>
/// Read all settings for output Dictionary<string,string>
/// </summary>
/// <returns>Return the Dictionary<string,string> contains all settings</returns>
public Dictionary<string, string> ReadAllSettings()
{
var result = new Dictionary<string, string>();
foreach (var key in ConfigurationManager.AppSettings.AllKeys)
result.Add(key, ConfigurationManager.AppSettings[key]);
return result;
}
Upvotes: 0
Reputation: 17183
Add namespace
using System.Configuration;
and in place of
ConfigurationSettings.AppSettings
you should use
ConfigurationManager.AppSettings
String path = ConfigurationManager.AppSettings["configFile"];
Upvotes: 34
Reputation: 6834
You should add System.configuration dll as reference and use System.Configuration.ConfigurationManager.AppSettings["configFile"].ToString
Don't forget to add using
statement at the beginning. Hope it will help.
Upvotes: 4
Reputation: 754230
Since you're accessing a web.config
you should probably use
using System.Web.Configuration;
WebConfigurationManager.AppSettings["configFile"]
Upvotes: 169
Reputation: 21784
ConfigurationManager.AppSettings["configFile"]
http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.appsettings.aspx
Upvotes: 7