Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Web.config Build vs Release transform not working

I have an ASP.NET Web Application project that connects to a remote database via the Entity Framework. During debugging (eg running the project on my local computer), the IP address to the database is different than during release (eg after uploading the project to my webserver and running it from the browser). Until now I have always manually changed the database connection string in the Web.config file to switch between the two (basically I had to connection strings, one named 'Debug' and one 'Release' and I just swapped around the names whenever I deployed).

Now I just noticed that it should be possible to let this happen automatically via the Web.config Transformation Syntax where you put the modified connection string in the Web.Release.config version and it should then use that when the DLL is built under Release configuration.

However it does not seem to work for me...

Here is the relevant part of my regular Web.config file (which holds the Debug connection string for local usage):

<?xml version="1.0"?> <configuration>    <connectionStrings>     <!-- Debug connection string. Release connection string is in Web.Release.config file -->     <add name="DatabaseEntities" connectionString="A" providerName="System.Data.EntityClient" />   </connectionStrings>  </configuration> 

Here is the Web.Release.config file, which according to the examples should replace the 'DatabaseEntities' connection string "A" with "B" if the DLL is under Release mode:

<?xml version="1.0"?> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">    <!-- Replace the DatabaseEntities connection string with the Release version (local IP address) -->   <connectionStrings>     <add name="DatabaseEntities"       connectionString="B"       xdt:Transform="Replace" xdt:Locator="Match(name)"/>   </connectionStrings>  </configuration> 

(Obviously "A" and "B" are just place-holders for my real connection strings)

When I debug the application (e.g. just press F5) the default Web.config is used and I can access the database. I then change the build configuration to Release via the Configuration Manager. All the projects in the solution are set to Release configuration. Then I Build the solution (just via Build or even via a complete rebuild (e.g. Clean, Rebuild)). I upload the newly built DLLs to the webserver, as well as the Web.config and Web.Release.config files, and when I try to access the database I am unable, it is still trying to access the database via the debug IP address and hence cannot find it...

It seems the Web.Release.config file is completely ignored, or at least the connection string is not being replaced.

What am I doing wrong? Is the transformation syntax wrong? Am I not building the application under Release mode correctly?

like image 685
Nick Thissen Avatar asked Jan 19 '13 15:01

Nick Thissen


People also ask

How do I create a new transformation in web config?

If you have a web application project, Right-click on web. config and choose Add Config Transform. This will add any config transforms that are missing from your project based on build configurations (i.e. if you have Production and Staging build configs, both will get a transform added).

How does web config transform work?

A Web. config transformation file contains XML markup that specifies how to change the Web. config file when it is deployed. You can specify different changes for specific build configurations and for specific publish profiles.

Where is web config file in Visual Studio 2022?

config file is located in the %SystemRoot%\Microsoft.NET\Framework\%VersionNumber%\CONFIG\ folder.

What is Xdt transform replace?

A Transform attribute on a parent element can affect child elements even if no Transform is specified for them. For example, if you put the attribute xdt:Transform="Replace" in the system. web element, all the elements that are children of the system. web element are replaced with the content from the transform file.


1 Answers

Then I Build the solution (just via Build or even via a complete rebuild (e.g. Clean, Rebuild)). I upload the newly built DLLs to the webserver, as well as the Web.config and Web.Release.config files

There is your error: Web config transforms won't work for your local environment, if you simply build. You need to publish.

Your deployment process seems weird: You are only copying DLLs, Web.config and web.Release.config. To me it seems, that you copy your source code and not a compiled application. A published WebApplication doesn't contain a web.release.config.

You should publish your project (rightclick on your WebApplication -> Publish) to your local filesystem and copy the files from there, or use another deployment method of your choice.

2 years ago I wrote an article about web.config transforms. It gives you a step-by-step tutorial for VS 2010 (The publish dialog changed in VS 2012): http://www.tomot.de/en-us/article/5/asp.net/how-to-use-web.config-transforms-to-replace-appsettings-and-connectionstrings

like image 108
citronas Avatar answered Sep 30 '22 22:09

citronas