En .Net framework 4 (Visual Studio 2010) ahora hay una funcionalidad que permite tener diferentes configuraciones del web.config para cada ambiente de desarrollo, pruebas y/o producción. Una solución para un problema de siempre.
Este es un problema de hace tiempo y que por fin Microsoft se decidió a darnos una herramienta para solucionarlo, he visto diferentes implementaciones de esta solución efectuadas por los programadores, pero recomiendo el uso de esta funcionalidad ya que esta disponible en Visual Studio 2010.
El problema consiste en que para los que desarrollan web en .Net la configuración se suele y se recomienda que este en el web.config, pero usualmente esta configuración debe ser diferente para cada ambiente, por ejemplo, para el ambiente local, para un servidor de pruebas, uno de staging y uno o varios de producción, y es un poco complicado resolver como tener diferentes web.config para cada ambiente y que esto no implique algo manual para evitar una equivocación a la hora de publicarse la aplicación en cada uno de los ambientes.
Para solucionar esto, Visual Studio 2010 ahora viene con una funcionalidad que permite transformar el web.config durante el proceso de publicación para modificar la configuración para cada ambiente, manteniendo automaticamente diferentes web.config en cada ambiente.
Pasos:
Primero, no cree el proyecto como un sitio web (“Web Site”), ya que este tipo de proyecto no tiene esta caracteristica, debe crear el proyecto como una aplicación web ASP.Net (“ASP.Net Web Application”).

Al hacer esto notará que se crean unos archivos debajo del Web.config (en el Solution Explorer), cada uno de estos correspondiente a cada una de las configuraciones del Configuration Manager.


Ahora vaya al Configuration Manager para crear una nueva configuración para un servidor de producción, asegurese de marcar “Create new project configurations”.



Esto crea una nueva configuración.

Ahora puede dar click derecho sobre el archivo de Web.config y usar la opción “Add Config Transformations” que agregará un archivo de transformación por cada configuración creada que aun no tenga un archivo de transformación.


Cree una nueva configuración de publicación.


Ejemplo de web.config
<configuration>
<appSettings>
<add key="APIKey" value="5200eb9e591cc4a19178f8fac1c210fc"/>
<add key="Secret" value="e957123205f4a7f7a95e2d352bcaf444"/>
<add key="ServiceBase" value="http://localhost:49396/"/>
<add key="Callback" value="http://localhost:26813/101FTB/"/>
</appSettings>
<connectionStrings>
<add name="MyDBConnectionString" connectionString="Data Source=localhost;Initial Catalog=FreeTechBooks;User ID=Guest" providerName="System.Data.SqlClient"/>
</connectionStrings>
...
</configuration>
Ejemplo de transformación de web.config para producción (web.config.produccion)
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add value="a44a569d89f09862bdeac3e9e7c155aa" xdt:Transform="SetAttributes(value)" xdt:Locator="Condition(@key='APIKey')"/>
<add value="9a6e6fbda2558fad51f25b7f62bad80d" xdt:Transform="SetAttributes(value)" xdt:Locator="Condition(@key='Secret')"/>
<add value="http://www.mysitelive.com/" xdt:Transform="SetAttributes(value)" xdt:Locator="Condition(@key='ServiceBase')"/>
<add value="http://fbapps.mysitelive.com/myapplive/" xdt:Transform="SetAttributes(value)" xdt:Locator="Condition(@key='Callback')"/>
</appSettings>
<connectionStrings>
<add name="MyDBConnectionString"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
<system.web>
</system.web>
</configuration>
Hay diferentes formas de transformar el web.config, este es un ejemplo sencillo que modifica el value para unos settings y el tag completo para el connectionString.
En el momento en que se hace la publicación Visual Studio modifica el archivo que pone en el servidor.
Para más información de las transformaciones puede leer aquí: Referencia