Using MSDeploy to update and remove sections in web.config. A simple example
I got a case the other day where customer was using Microsoft Web Deploy 3.0.
"Web Deploy 3.0"
https://www.iis.net/downloads/microsoft/web-deploy
There were 3 questions around this.
. How to change the value of some settings for their site in the web.config.
. How to remove or delete a whole section in the web.config.
. How to do this using the -setParamFile argument.
This post shows how to do this in a step by step fashion. The assumption is of course that Web Deploy is installed.
This should be at: C:\Program Files\IIS\Microsoft Web Deploy V3\
Rather than using two IIS instances, I will just use two directories. One to be the Source and one to be the Destination.
#1 Create a Src directory: C:\WebDeployDemo\Src
#2 Create a Dst directory: C:\WebDeployDemo\Dst
#3 Create a web.config in both Src and Dst directories, i.e.:
C:\WebDeployDemo\Src\web.config
and
C:\WebDeployDemo\Dst\web.config
#4 Set the content of both the web.config files to be:
<configuration>
<sites>
<site description="someDescription" siteId="someId">
<siteSettings aBooleanSetting="False" aStringSetting="someStringValue"/>
</site>
</sites>
<customSection>
<add value="someValue1" enabled="False"/>
<add value="someValue2" enabled="True"/>
</customSection>
</configuration>
#5 Create a parameter file (to be used by the -setParamFile argument) called ParameterFile.xml in the C:\WebDeployDemo directory, i.e.:
C:\WebDeployDemo\ParameterFile.xml
Set the content to:
<parameters>
<parameter name="changeBool" value="True">
<parameterEntry type="XMLFile" scope="web.config$" match="//configuration/sites/site/siteSettings/@aBooleanSetting"/>
</parameter>
<parameter name="changeString" value="aNewAndChangedValue">
<parameterEntry type="XMLFile" scope="web.config$" match="//configuration/sites/site/siteSettings/@aStringSetting"/>
</parameter>
<parameter name="removeSection" value="">
<parameterValidation kind="AllowEmpty" />
<parameterEntry type="XMLFile" scope="web.config$" match="//configuration/customSection"/>
</parameter>
</parameters>
The above file will do the following:
. Change the “aBooleanSetting” to TRUE in the destination.
. Change the “aStringSetting” to “aNewAndChangedValue” in the destination.
. Remove the “customSection” section all together in the destination.
#6 Open a command prompt and navigate to C:\Program Files\IIS\Microsoft Web Deploy V3\
#7 Run the following command to execute the changes using the parameters file we just created:
msdeploy -verb:sync -source:dirpath=C:\WebDeployDemo\Src -dest:dirpath=C:\WebDeployDemo\Dst -setParamFile=C:\WebDeployDemo\ParameterFile.xml
#8 Check the web.config in the Dst folder, it should now be:
<configuration>
<sites>
<site description="someDescription" siteId="someId">
<siteSettings aBooleanSetting="True" aStringSetting="aNewAndChangedValue" />
</site>
</sites>
</configuration>
And there you go :-)
NOTE: The above parameter in the ParameterFile.xml will remove the <customSection> section all together.
If you would like to keep the section and but remove all entries, in other words to have the web.config look as follows:
<configuration>
<sites>
<site description="someDescription" siteId="someId">
<siteSettings aBooleanSetting="True" aStringSetting="aNewAndChangedValue" />
</site>
</sites>
<customSection>
</customSection>
</configuration>
Then you can use a wildcard in the ParameterFile.xml like so:
<parameter name="removeSection" value="">
<parameterValidation kind="AllowEmpty" />
<parameterEntry type="XMLFile" scope="web.config$" match="//configuration/customSection//*"/>
</parameter>
Some references:
"Web Deploy Operation Settings"
https://technet.microsoft.com/en-us/library/dd569089(v=WS.10).aspx
"Using declareParam and setParam"
https://technet.microsoft.com/en-us/library/dd569084(v=ws.10).aspx
Comments
Anonymous
November 06, 2012
Hi Michael, I have a web deployment package which contains the below files. WebApplication.deploy.cmd WebApplication.SetParameters.xml WebApplication.SourceManifest.xml WebApplication.zip I am using octopus tool to deploy the web application in multiple servers. Problem: Can i pass configurable parameters from octopus (i mean parameters for web.config to update some keys) to Deployment package to WebApplication.deploy.cmd. If yes, How can i pass the parameters to update my web.config file. Any help in this regard would be great. Thanks, Sabari.Anonymous
November 03, 2013
FYI, the "type" attribute on "parameterEntry" should be "kind".Anonymous
November 21, 2013
Hi, Thanks for this, It works really well. One question I have is regarding that custom section. I want to update a web.config file, however I want to keep a section of the web.config on the destination, but replace everything else. For example I have a section in my web.config as below. <appSettings> <add key="LookupCacheExpiration" value=""/> <add key="MainPrimaryColour" value=""/> <add key="MainBackgroundColour" value=""/> <add key="MainWindowColour" value=""/> <add key="MainWindowBorderBrushColour" value=""/> <add key="CacheUser" value=""/> <add key="CacheHash" value=""/> <add key="SessionServer" value=""/> <add key="ApplicationServer" value=""/> <add key="LogoFileName" value=""/> <add key="LogoAlignment" value=""/> <add key="CrystalViewer" value=""/> <add key="ExclusionsOnline" value=""/> </appSettings> I don't want to overwrite this section on my destination, I want it to keep the values it has, but sometimes the rest of the web.config file changes. Is there a way for me to use a wildcard to exclude everything between appSettings, but replace everything else in the web.config with the source file? Many thanks Carl