I have a scenario where I need to read an environment variable on start, then depending on the value of the ENV variable I need to merge a config file with the App.config file.
E.g.
MyApp.exe
MyApp.exe.config
Stage\MyApp.exe.config
Live\MyApp.exe.config
On start
-if the Environment variable = Stage, then Merge the config file in the Stage folder
-if the Environment variable = Live, then Merge the config file in the Live folder
If I had the following in the default MyApp.exe.config
<appSettings>
<add key="SomeKey" value="SomeValue">
</appSettings>
and then had the following in the Stage\MyApp.exe.config
<appSettings>
<add key="SomeKey" value="Some NEW Value">
</appSettings>
I'd expect my application to read the value for SomeKey as "Some NEW Value".
I can't seem to find a clean way to implement this exact approach.
Thanks
Warrick
You might want to use Build Events in Visual Studio.
http://msdn.microsoft.com/en-us/library/42x5kfw4(v=vs.90).aspx
You can use the variable to copy the overwrite the app.config in the pre-build event:
$(ConfigurationName)
If the config name is DEV, then copy the app.config.DEV over the app.config
If the config name is PROD, then copy the app.config.PROD over the app.config
Related
I am using a windows application in which I have config files (dev.config, prod.config, uat.config) located in multiple folders such as dev, prod, uat. I want to get the particular config file values such as connectionstrings based on the certain condition from a particular folder and I want to add the corresponding connectionstrings in the root app.config file. Then I need to fetch data based on the added connection string. Can anyone help me on this?
What you can do pretty easily is to externalize your connection strings (we tend to put them into App_Data\config, since that folder is protected by IIS and nothing from that folder will be returned when trying to browse it)
So in your main web.config, you would have something like this:
<connectionStrings configSource="App_Data\config\dev.config" />
and then you go to testing, you just change that to
<connectionStrings configSource="App_Data\config\uat.config" />
and in your individual config files, you just have that one section:
dev.config:
<connectionStrings>
<add name="SomeName"
connectionString="server=.;database=test;integrated Security=SSPI;"
providerName="System.Data.SqlClient" />
......
</connectionStrings>
You could load a custom config file based on a condition using ExeConfigurationFileMap and ConfigurationManager.OpenMappedExeConfiguration().
ExeConfigurationFileMap configFileMap = ExeConfigurationFileMap("path/to/custom.config");
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None)
When you have the config object, you can then pick the given section you need, in your case the connectionstrings.
ConnectionStringsSection connectionStrings = config.ConnectionStrings;
You could then load whichever config file you want based on the conditions you want, and pick out the parts you'd like.
More info about the ConnectionStringsSection with a short example (MSDN).
I have a BizTalk config file that I want to use in my C# application. I'd like to get the connection string from the BizTalk config. Is there a way to do this? Simply put, I want to read a connection string from an external config file.
What I'm currently using in my C# app config is:
<configuration>
<appSettings>
<add key="foo" value="blah;"/>
<add key="foo" value="blah;"/>
</appSettings>
</configuration>
I get the keys by using this code:
connectionString = ConfigurationManager.AppSettings[configKey];
Thanks.
From an external .config file, as in not the current .exe's config file, no.
System.Configuration will always refer to the local .config.
To access another .exe's .config file, you have to treat it as just an Xml file with System.Xml.
I'm using .NET MVC
I have about 10 properties I want to store in a configuration file (.config etc.), related to environment/deployment stuff, + other things for quick changes without doing dLL deploys.
I'm using Team foundation service for CI builds etc, and my web.config is obviously under version-contrl.
What I'd like to do is have a settings.config (that's not in version control) file to store these, am I able to do this?
Or does it need to be in web.config?
To answer the title question, yes you can store settings in a separate config file, to do so you need to define the configSource property of appSettings element
E.g.
<appSettings configSource="settings.config" />
and in the settings.config file
<?xml version="1.0" encoding="UTF-8"?>
<appSettings>
<add key="settingKey" value="environmentValue" />
</appSettings>
However, for the sake of environment specific settings, you may want to look at config transforms. Setting up a transform config for each environment then deploying to that environment with the specified build configuration.
E.g. Web.Dev.config (provided you have setup a 'Dev' build configuration)
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="settingKey"
value="devEnvironmentValue"
xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
</configuration>
More details of build configuration and config transforms here: http://msdn.microsoft.com/en-us/library/dd465318(v=vs.100).aspx
Or you could take advantage of TFS features and parameterize the environment variables, I don't have a lot of experience with this, but the following should help: http://ig.obsglobal.com/2013/02/tfs-and-continuous-deployment-part-4-parameterized-deployments/
I have a .net github project that is basically a wrapper around a web API. In the test project, I am calling to the API using an API key. I need to keep this key private, how do I accomplish this in a visual studio project?
In some other projects, like python, I can have git ignore the file (config.py) and use something like config.example.py. But in visual studio's case, the project will not compile because of the missing file Config.cs. What is the proper way to solve this? I'm thinking of using this same method of ignoring the file and have them execute a build script that should rename Config.example.cs to Config.cs?
This is the perfect for .config files. Depending on whether its a web or console application, you will have a web.config or app.config file in your project.
You can use the appSettings section to store your API key.
To make things even easier, you can actually have this section read from another file, ie: specialappsettings.config and then just ignore that single file from your repository.
Modify your web.config (or app.config):
<configuration>
<appSettings file="specialappsettings.config">
</appSettings>
<system.web>
<!-- standard web settings go here -->
</system.web>
</configuration>
Create a new specialappsettings.config file:
<appSettings>
<add key="APIKey" value="YourApiKeyValue" />
<add key="AnotherKey" value="AnotherValue" />
</appSettings>
This can be accessed in your code via:
var apiKey = ConfigurationManager.AppSettings["APIKey"];
Notes:
You can keep your settings within the original web.config file as
well but this lets you ignore just the specific settings file from
your git repository without affecting the rest of the project's
necessary configuration details.
The same "key" can be saved in
either file however the external file will override the original
web.config file value.
You are probably looking for the App.config file for a project. It will be copied to <application>.exe.config when you compile it. Users can edit that config file as needed.
In that config file, you can add your API keys:
<configuration>
<appSettings>
<add key="APIKey" value="12345"/>
</appSettings>
</configuration>
Then you can access it from your code using ConfigurationManager.AppSettings:
string apiKey = ConfigurationManager.AppSettings["APIKey"];
One option is to use .config files instead of having secret keys hardcoded in sources.
More info Using Settings in C# and step-by-step guide
<configuration>
<appSettings>
<add key="SecretKey" value="0" />
</appSettings>
</configuration>
var secretKey = ConfigurationManager.AppSettings.Get("SecretKey");
Perhaps you can store the key outside of the Config.cs file and load it at run time.
Bonus, other people using your code won't have to recompile the project to change to their API key.
I discovered few days ago that we can use Configuration files in .NET and trying to use it in my applications.
First of all, configure correctly the use of configuration file is really borring :
Configuration file should have the same name as the application (understandable)
Then think to add the System.Configuration reference (understandable too)
When file is added, go in it's properties and change it to copy the file in output directory (less understandable).
Configuration file isn't taken into account in debug mode (because of *.vhosts.exe)
It takes me time to understand why this file wasn't taken into account...
So question is pretty simple, how can I fix this and use configuration files in Debug Mode ?
I would use it in order to configure my trace switches.
Here is my App.config file :
<configuration>
<appSettings>
<add key="A" value="B"/>
</appSettings>
<system.diagnostics>
<switches>
<add name="myFirstSwitch" value="1" />
<add name="MySecondSwitch" value="Error" />
</switches>
</system.diagnostics>
</configuration>
Thanks.
I think you created your config file the wrong way, the right way is:
On the Project menu, click Add New Item. The Add New Item dialog box
appears.
Select the Application Configuration
File template and then click Add. A
file named App.config is added
to your project.
This config file is automatically copied to the build folder when you build the project and works in both Debug and Release mode.