How to programmatically retrieve the configSource Location from config file - c#

Does anyone know how i can get the configSource value using standard API?
<appSettings configSource="AppSettings.config" />
Or do i need to parse the web.config in XML to get the value?

You need to load the AppSettingsSection, then access its ElementInformation.Source property.
The link above contains information about how to access this section.

Try
ConfigurationManager.AppSettings["configSource"]
you need to add : using System.Configuration; namespace in your code

Need to use the config manager as #competent_tech mentioned.
//open the config file..
Configuration config= ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
//read the ConfigSource
string configSourceFile = config.AppSettings.SectionInformation.ConfigSource;

Couldn't get the API to correctly load the AppSettings section correctly using the suggestions from #dbugger and #competent_tech.
Unable to cast object of type 'System.Configuration.DefaultSection' to type
'System.Configuration.AppSettingsSection'.
Eventually went the XML route in just as many lines of code:
XDocument xdoc = XDocument.Load(Path.Combine(Server.MapPath("~"), "web.config"));
var query = from e in xdoc.Descendants("appSettings")
select e;
return query.First().Attribute("configSource").Value;
Thanks to all for the pointers.

You can use:
<appSettings>
<add key="configSource" value="AppSettings.config"/>
<add key="anotherValueKey" value="anotherValue"/>
<!-- You can put more ... -->
</appSettings>
And retrieve the value:
string value = ConfigurationManager.AppSettings["configSource"];
string anotherValue = ConfigurationManager.AppSettings["anotherValueKey"];
don't forget:
using System.Configuration;

Related

What does ConfigurationManager.AppSettings do?

My current understanding is that it making a call to something in my config file and returning data. I am not clear what the parameters are for ConfigurationManager.AppSettings are.
I have looked through this documentation (https://msdn.microsoft.com/en-us/library/1xtk877y%28v=vs.110%29.aspx) but don't quite understand it.
For context this is the code I'm working with:
string code1 = ConfigurationManager.AppSettings[string1 + string2];
string code2 = ConfigurationManager.AppSettings[string3];
string query = new BuildMDXQuery(cube).BuildFetchInventoryQuery(code1, code2);
I'd like to know how I can find what's getting called in my config file, if anything, and what the purpose of using ConfigurationManager.AppSettings is. Thanks!
It reads from the appSettings section of the config file, so...
Configuration.AppSettings["Whatever"]
...would return "Blah" in the case of:
<configuration>
<appSettings>
<add key="Whatever" value="Blah" />
</appSettings>
</configuration>

Get appSettings configSource from code

Is there a way to retrieve configSource from code? I founded How to programmatically retrieve the configSource Location from config file, but all answers are wrong.
I have following config:
<configuration>
<appSettings configSource="appsettings.config"/>
</configuration>
When I tried to invoke following code:
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var file = config.AppSettings.File;
file is always empty. Same is for ConfigurationManager.AppSettings["configSource"]. I think something changed in .NET 4, because answers are old ones.
I tried also config.AppSettings.SectionInformation.ConfigSource but it is also empty.
I need this path to enable monitoring of appSettings. You could read more: How to discover that appsettings changed in C#?
I have some problems with this but I finally find an answer.
When config file looks like this:
<configuration>
<appSettings file="appsettings.config"/>
</configuration>
The code above is working correctly:
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var file = config.AppSettings.File;
But when config file is (it works same as above but syntax is different):
<configuration>
<appSettings configSource="appsettings.config"/> <!-- configSource instead of file -->
</configuration>
I have to use following:
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var file = config.AppSettings.SectionInformation.ConfigSource;
So I have to check if config.AppSettings.SectionInformation.ConfigSource and config.AppSettings.File is not an empty string and monitor correct one.

use ConfigurationManager to store user values in a file that is separate from the app config

Ok, I've just about given up on this.
I would like to be able to record user preferences using a user config file, which would be referenced from the app config file. I am trying to do this with ConfigurationManager and an app config file. I can read just fine from the user settings, but setting them is a whole other problem. I would like to keep the app settings separate from the user settings in two different files.
When I use this:
<appSettings file="user.config">
</appSettings>
and user.config looks like:
<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="localSetting" value="localVal"/>
</appSettings>
I can use ConfigurationManager to READ the local setting, but not to save to the file.
var oldLocVal = ConfigurationManager.AppSettings["localSetting"];
ConfigurationManager.AppSettings.Set("localSetting", "newLocalValue"); // Doesn't save to file.
If instead my user.config file is:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="localSetting" value="localVal"/>
</appSettings>
</configuration>
I would then like to call and save the AppSettings in this way:
var uMap = new ConfigurationFileMap("user.config");
var uConfig = ConfigurationManager.OpenMappedMachineConfiguration(uMap);
var oldLocalVarFromConfig = uConfig.AppSettings.Settings["localSetting"]; // NO
uConfig.AppSettings.Settings.Remove("localSetting"); // NO
uConfig.AppSettings.Settings.Add("localSetting", "newValue");
uConfig.Save();
but it won't let me access the configuration's app settings. (It has a problem casting something as an AppSettings)
I also tried with configSource instead of file attributes in the app config appSettings element.
I was using the examples here for help, but unfortunately it wasn't enough.
Thanks in advance.
You can load external config files into a 'Configuration' instance. Here is an example of a singleton class with a static constructor that uses this strategy. You can tweak it a bit to do what you want, I think.
private const string _path = #"E:\WhateverPath\User.config"
static ConfigManager()
{
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap()
{
ExeConfigFilename = _path
};
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
// get some custom configuration section
_someConfigSection = config.GetSection("SomeSection") as SomeSection;
// or just get app settings
_appSettingSection = config.AppSettings;
}
Maybe try adding this way, making sure to call Save()
_appSettingSection.Settings.Add("SomeKey", "SomeValue");
//make sure to call save
config.Save();
To its credit, this code here works.
Also, I made a simple XML serializable object that saved itself to disk any time Save was called on it.

How to check the particular section or key word exist in appconfig file

I have added my own section <section listeners> in my app.config file.
How can I check, programmatically, if the new section exist?
section = ConfigurationManager.GetSection("sectionName") as SectionType
section will be null if the section isn't there.
You might want to have a look at How to: Create Custom Configuration Sections Using ConfigurationSection
You have to access it like a normal XML file.
var config = XDocument.Load("App.Config");
var element = config
.Element("section");
...

Best way to do a setting in ASP.net

With settings, I've always had some const variable in a file somewhere. Is it possible to create a new config file with all my settings for my website? IE:
CONST imagePrefixPath = "http://img.domain.com/"
Is the sort of thing I want to store and use all over my web code
Use the appSettings in the web.config instead:
<configuration>
<appSettings>
<add key="imagePrefixPath" value="http://img.domain.com/" />
</appSettings>
</configuration>
Then access it in code access the appSettings variables using OpenWebConfiguration
System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(null);
String imagePath = config.AppSettings.Settings["imagePrefixPath"] + "myimage.jpg";
You can create a Settings file (add a new item=> settings file), which will also create a strongly typed class with the same names and values you set inside it.

Categories