Transforming Connection String in Web.Release.config - asp.net

I am trying to use the Web.Release.config file to store an alternative MySQL connection string ready for the live environment, but I just can't seem to get it to work.
In my Web.config I have my local db set up like so:
<connectionStrings>
<add name="MySQLConnection" connectionString="Server=localhost;Database=local;Uid=userid;Pwd=12345678;" providerName="System.Data.MySqlClient" />
</connectionStrings>
Then my Web.Release.config looks like this:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add name="MySQLConnection" connectionString="Server=localhost;Database=live;Uid=userid;Pwd=12345678;" providerName="System.Data.MySqlClient"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
</configuration>
And I am grabbing my connection string in code using:
ConfigurationManager.ConnectionStrings["MySQLConnection"].ConnectionString;
I have tried switching the config version and running and I get the exact same data being pulled out, all from the local db. If anyone could point me in the right direction I'd really appreciate it!

Related

How to Update the .config file using Azure DevOps "Update config" Task

I want to Update the Web.config file using Azure DevOps Release Pipeline.
I am using [Update Config][1] Task from MarketPlace.
[1]: https://marketplace.visualstudio.com/items?itemName=digitalmedia34.updateconfig
Here Is the Web.config File
<!-- Some Contents -->
<configuration>
<appSettings>
<add key="Setting1" value="local setting"/>
<add key="CommonSetting" value="local common setting"/>
</appSettings>
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=LocalSQLServer;Initial Catalog=MyReleaseDB;User ID=xxxx;Password=xxxx" />
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.7.2"/>
<httpRuntime targetFramework1="4.7.2"/>
</system.web>
</configuration>
I am able to change the value of some configuration by adding variables like [Variables]
[2]: https://i.stack.imgur.com/uq85Y.png
My Question is how can I change the values of Nested Property. For Example if I want to change the targetFramework in
<system.web>
<compilation debug="true" targetFramework="4.7.2"/>
<httpRuntime targetFramework1="4.7.2"/>
</system.web>
Please let me know how can I update these values
Thanks in advance
How to Update the .config file using Azure DevOps "Update config" Task
You could use the task Replace Tokens to update the key's values,
the format of variable in .config file is #{TestVersion}#:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="Setting1" value="local setting"/>
<add key="CommonSetting" value="local common setting"/>
</appSettings>
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=LocalSQLServer;Initial Catalog=MyReleaseDB;User ID=xxxx;Password=xxxx" />
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="#{TestVersion}#"/>
<httpRuntime targetFramework1="#{TestVersion}#"/>
</system.web>
</configuration>
Use Replace Tokens task to update the key's values:
And define the key's values on the Variables.

Can I move asp.net authentication related configuration out of web.config

I have an asp.net WebApi application where I would like to move any configuration that is likely to change out of web.config into an external configuration file.
This will then allow an install update to overwrite the web.config so that it picks up any newer configuration added between version, but preserve other user settings which may vary between deployments.
I have successfully done this with a few sections, eg appSettings.
For appSettings, I have the folliwing in web.config...
<appSettings configSource="config\appSettings.config"/>
And then the external file has the various settings, eg ...
<?xml version="1.0" encoding="utf-8"?>
<appSettings>
<add key="IISSitePrefix" value="http" />
<!--- Set this to True to emit http request debug information to the Event log -->
<add key="EnableHttpDebugTracing" value="false" />
.... etc
I have been trying to do the same with the two configuration settings we need to change to toggle on/off windows authentication, as some deployments will use this, and others will use token based security. To do this I need to move the following out of web.config...
<authentication>
<windowsAuthentication enabled="true" />
</authentication>
<system.web>
<authentication mode="Windows"/>
</system.web>
So for the first tag, I tried the following....
<authentication configSource="config\authentication.config"/>
with the contents of the external file being..
<?xml version="1.0" encoding="utf-8"?>
<authentication>
<windowsAuthentication enabled="true" />
</authentication>
However, when I run this, I get the following error...
The configuration section 'authentication' cannot be read because it is missing a section declaration
I get a similar result when I try the other section.
Does anyone know what this means, or even if it is possible to do the above?
Thanks in advance for any help
[EDIT 1]
After one of the comments I have realised, perhaps my configuration is not quite correct (it was some time ago I first looked at this, and am now revisiting)
Previously, to enable integrated (windows) authentication, I thought you needed two bits of configuration (system.web AND system.webserver)...
<system.web>
<authentication mode="Windows"/>
</system.web>
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true" />
</authentication>
</security>
</system.webServer>
BUT now looking at this post, it appears I only need the <system.webServer> and not <system.web> at all
I removed my <system.web> and I could indeed turn off the intergarted authentication using just the <system.webServer> section.
So, now, what I want to configure in the external file is just the following..
ie if possible I'd like to just move out the <security> section, and leave the rest of the <system.webServer> in web.config.
I tried the following ..
<system.webServer>
<security configSource ="config\authentication.config"/>
</system.webServer>
With the contents of authentication.config being...
<?xml version="1.0" encoding="utf-8"?>
<security>
<authentication>
<windowsAuthentication enabled="true" />
</authentication>
</security>
But now when I try to execute a route I get..
Unrecognized attribute 'configSource'
Config Source:
87:
88: <security configSource ="config\authentication.config"/>
89:
So my (modified) question becomes is there a way to move out the above section?
Try changing the external file from
<?xml version="1.0" encoding="utf-8"?>
<authentication>
<windowsAuthentication enabled="true" />
</authentication>
to:
<?xml version="1.0" encoding="utf-8"?>
<authentication mode="Windows"></authentication>
It works for me ;)

asp.net web.config transform not working

I've made several configurations inside a project for different environments, one is debug and another is release
Web.config:
<configuration>
<connectionStrings>
<add name="InvitationEntity" connectionString="metadata=res://*/Models.InvitationSystem.csdl|res://*/Models.InvitationSystem.ssdl|res://*/Models.InvitationSystem.msl;provider=System.Data.SqlClient;provider connection string="data source=192.168.7.131;initial catalog=Invitation_Debug;persist security info=True;user id=invitation;password=debugMe;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
<appSettings>
<add key="FilePath" value="D:\temp"/>
<add key="debugMode" value="Y"/>
</appSettings>
</configuration>
Web.debug.config:
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
<connectionStrings xdt:Transform="Replace">
<add name="InvitationEntity" connectionString="metadata=res://*/Models.InvitationSystem.csdl|res://*/Models.InvitationSystem.ssdl|res://*/Models.InvitationSystem.msl;provider=System.Data.SqlClient;provider connection string="data source=192.168.7.131;initial catalog=Invitation_Debug;persist security info=True;user id=invitation;password=debugMe;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
Web.live.config:
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
<connectionStrings xdt:Transform="Replace">
<add name="InvitationEntity" connectionString="metadata=res://*/Models.InvitationSystem.csdl|res://*/Models.InvitationSystem.ssdl|res://*/Models.InvitationSystem.msl;provider=System.Data.SqlClient;provider connection string="data source=192.168.7.133;initial catalog=Invitation_Debug;persist security info=True;user id=invitation;password=Invi#2014;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
Here's the problem:
Whenever I use debug or release config, the connection string is still the one in web.config instead of that in web.release.config
Is there anything that I did wrong?
It is sometimes better to use item-by-item transformations. Instead of section replacement use
<add name="InvitationEntity" connectionString="metadata=res://*/Models.InvitationSystem.csdl|res://*/Models.InvitationSystem.ssdl|res://*/Models.InvitationSystem.msl;provider=System.Data.SqlClient;provider connection string="data source=192.168.7.133;initial catalog=Invitation_Debug;persist security info=True;user id=invitation;password=Invi#2014;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" xdt:Transform="Replace" xdt:Locator="Match(name)"/>
It is very useful to use this approach when you have lots of attributes in node and need to change only one, you just use SetAttributes instead of Replace for example.
Is your release build setup to use the Web.live.config file? by default Release expects a file named Web.Release.Config I'm just mentioning this because the file is listed as Web.live.config but you are calling it "Release". If it's just a typo and the names are consistent or if your release build configuration is set to "live" then ignore this.
For me, going to properties of the transformation file and changing the property; Copy to Output Directory to Copy Always did the trick. Got a hint from Matt Kogaj's answer
You have to remove property xdt:Transform in ConnectionString Tag. Like below;
<connectionStrings>
<add name="InvitationEntity" connectionString="metadata=res://*/Models.InvitationSystem.csdl|res://*/Models.InvitationSystem.ssdl|res://*/Models.InvitationSystem.msl;provider=System.Data.SqlClient;provider connection string="data source=192.168.7.133;initial catalog=Invitation_Debug;persist security info=True;user id=invitation;password=Invi#2014;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>

How to swap Connection String when publishing a project?

I can see that Web.config file contains two files:
-web.Debug.config
-web.Release.config
Inside this config files there is the following comment:
In the example below, the "SetAttributes" transform will change the
value of "connectionString" to use "ReleaseSQLServer" only when the
"Match" locator finds an atrribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
What is the "Match" locator ?
I already have a connection String in Web.config So how do I set this up?
should the main web.config file contain the production connection string or the other way around?
I'm looking for adivices from people that have done similar things
We are using xdt:Transform="Replace" which basically replaces the connection string of our development DB and it works perfectly. See below:
Development connection string (in your case web.Debug.config):
<connectionStrings>
<add name="MyDB" connectionString="Data Source=DebugSQLServer;Initial Catalog=MyDebugDB;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
Production connection string (in your case web.Release.config):
<connectionStrings xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<add name="MyDB" connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" xdt:Transform="Replace" xdt:Locator="Match(name)" />
</connectionStrings>
Match(name) means that the name of the connectionString in your case MyDB if it is same as in web.config that it will set the connectionString attributes to what you have in your web.debug.config file's connectionString when you publish the website. A complete documentation can be found at MSDN. And a basic how to do can be found here.

Web.Config not transforming as expected

When I build my application using Visual Studio in either debug or release mode the connection string that I'm trying to transform doesn't get inserted into the finalised web.config file
Relevant section of web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
</connectionStrings>
</configuration>
web.debug.config file:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings xdt:Transform="Replace" />
<connectionStrings>
<add name="DefaultConnection" xdt:Transform="Insert" providerName="System.Data.SqlClient"
connectionString="string value" />
</connectionStrings>
</configuration>
I've tried the files with this site and it seems to work ok
It turns out that what I had was fine but that the modified web.config file only gets generated when you publish the website.

Resources