realn
realn

Reputation: 1742

How to read appSettings section in the web.config file?

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

Answers (7)

Florian SANTI
Florian SANTI

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

MC9000
MC9000

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>
          &lt;h1&gt;Hello World&lt;/h1&gt;
          &lt;p&gt;
      Ipsum Lorem
          &lt;/p&gt;
        </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

williambarau
williambarau

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

Vishal Suthar
Vishal Suthar

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

curiousBoy
curiousBoy

Reputation: 6834

You should add System.configuration dll as reference and use System.Configuration.ConfigurationManager.AppSettings["configFile"].ToString

Don't forget to add usingstatement at the beginning. Hope it will help.

Upvotes: 4

marc_s
marc_s

Reputation: 754230

Since you're accessing a web.config you should probably use

using System.Web.Configuration;

WebConfigurationManager.AppSettings["configFile"]

Upvotes: 169

Bassetassen
Bassetassen

Reputation: 21784

ConfigurationManager.AppSettings["configFile"]

http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.appsettings.aspx

Upvotes: 7

Related Questions