I need to use different database connection string and SMTP server address in my ASP.NET application depending on it is run in development or production environment.
<On one project where we had 4 environments (development, test, staging and production) we developed a system where the application selected the appropriate configuration based on the machine name it was deployed to.
This worked for us because:
It worked well for us in this instance, but probably wouldn't work everywhere.
The <appSettings>
tag in web.config supports a file attribute that will load an external config with it's own set of key/values. These will override any settings you have in your web.config or add to them.
We take advantage of this by modifying our web.config at install time with a file attribute that matches the environment the site is being installed to. We do this with a switch on our installer.
eg;
<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">
<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">
<appSettings file=".\EnvironmentSpecificConfigurations\production.config">
Note:
In Visual Studio 2010 and above, you now have the ability to apply a transformation to your web.config depending on the build configuration.
When creating a web.config, you can expand the file in the solution explorer, and you will see two files:
They contain transformation code that can be used to
See Web.config Transformation Syntax for Web Application Project Deployment on MSDN for more information.
It is also possible, albeit officially unsupported, to apply the same kind of transformation to an non web application app.config
file. See Phil Bolduc blog concerning how to modify your project file to add a new task to msbuild.
This is a long withstanding request on the Visual Studio Uservoice.
An extension for Visual Studio 2010 and above, "SlowCheetah," is available to take care of creating transform for any config file. Starting with Visual Studio 2017.3, SlowCheetah has been integrated into the IDE and the code base is being managed by Microsoft. This new version also support JSON transformation.
I'd like to know, too. This helps isolate the problem for me
<connectionStrings configSource="connectionStrings.config"/>
I then keep a connectionStrings.config as well as a "{host} connectionStrings.config". It's still a problem, but if you do this for sections that differ in the two environments, you can deploy and version the same web.config.
(And I don't use VS, btw.)