Web.Config Debug / Release

82

Sé que web.config en Visual Studio 2010 ofrece la posibilidad de cambiar de las bases de datos del modo de depuración al modo de lanzamiento.

Aquí está mi Web.Release.config:

<?xml version="1.0"?>

<!-- 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">

  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Testing1" connectionString="Data Source=test;Initial Catalog=TestDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>

</configuration>

Aquí está mi código Web.Debug.config:

<?xml version="1.0"?>

<!-- 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">

  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Live1" connectionString="Data Source=Live;Initial Catalog=LiveDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>

</configuration>

Y este es mi código Web.config:

<?xml version="1.0"?>

<!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 -->
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">
       <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

    <membership>
       <providers>
          <clear/>
          <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
       </providers>
    </membership>

    <profile>
       <providers>
          <clear/>
          <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
       </providers>
    </profile>

    <roleManager enabled="false">
       <providers>
          <clear/>
          <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
       </providers>
    </roleManager>

  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

Cuando publico mi proyecto, no aparece nada en mi archivo Web.config. ¿No muestra la cadena de conexión de mi base de datos en vivo?

RG-3
fuente

Respuestas:

131

Las transformaciones web.config que forman parte de Visual Studio 2010 utilizan XSLT para "transformar" el archivo web.config actual en su versión .Debug o .Release.

En sus archivos .Debug / .Release, debe agregar el siguiente parámetro en sus campos de cadena de conexión:

xdt:Transform="SetAttributes" xdt:Locator="Match(name)"

Esto hará que cada línea de cadena de conexión encuentre el nombre coincidente y actualice los atributos en consecuencia.

Nota: No tendrá que preocuparse por actualizar su parámetro providerName en los archivos de transformación, ya que no cambian.

Aquí tienes un ejemplo de una de mis aplicaciones. Aquí está la sección del archivo web.config:

<connectionStrings>
      <add name="EAF" connectionString="[Test Connection String]" />
</connectionString>

Y aquí está la sección web.config.release haciendo la transformación adecuada:

<connectionStrings>
      <add name="EAF" connectionString="[Prod Connection String]"
           xdt:Transform="SetAttributes"
           xdt:Locator="Match(name)" />
</connectionStrings>

Una nota adicional: las transformaciones solo ocurren cuando publica el sitio, no cuando simplemente lo ejecuta con F5 o CTRL + F5. Si necesita ejecutar una actualización en una configuración determinada localmente, tendrá que cambiar manualmente su archivo Web.config para esto.

Para obtener más detalles, puede consultar la documentación de MSDN

https://msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx

Dillie-O
fuente
20
¿Puede agregar una nota de que esto sucede en el tiempo de publicación NO en el tiempo F5 a la respuesta? Aparentemente he tenido esto correcto durante 2 horas pero no me di cuenta de eso.
Paul
¿Cómo puedo hacer que esto funcione con Visual Studio Online Continuous Build? Quiero que transforme mi Web.Config durante la compilación y la implementación en Azure.
Rosdi Kasim
1
@RosdiKasim: no estoy seguro de si esto coincidirá al 100% con Visual Studio en línea, pero cuando necesito implementar un proyecto específico (si tengo varios) o usar una compilación diferente (y así transformar), especifico las cosas directamente en la instancia del sitio web de Azure. Aquí hay algunos detalles que escribí sobre eso hace un tiempo: freshconsulting.com/…
Dillie-O
aquí hay un enlace a MSDN que describe esto en detalles msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx
Hakan Fıstık
1
Su nota adicional sobre la ejecución del sitio en VS a través de F5 frente a la publicación fue muy útil para mí.
Denis M. Kitchen
8

Es posible usar el ConfigTransformdestino de compilación disponible como paquete Nuget: https://www.nuget.org/packages/CodeAssassin.ConfigTransform/

Todos los archivos de transformación "web. * .Config" se transformarán y generarán como una serie de archivos "web. *. Config.transformed" en el directorio de salida de la compilación independientemente de la configuración de compilación elegida.

Lo mismo se aplica a los archivos de transformación "app. *. Config" en proyectos no web.

y luego agregando el siguiente objetivo a su *.csproj.

<Target Name="TransformActiveConfiguration" Condition="Exists('$(ProjectDir)/Web.$(Configuration).config')" BeforeTargets="Compile" >
    <TransformXml Source="$(ProjectDir)/Web.Config" Transform="$(ProjectDir)/Web.$(Configuration).config" Destination="$(TargetDir)/Web.config" />
</Target>

Publicar una respuesta, ya que esta es la primera publicación de Stackoverflow que aparece en Google sobre el tema.

Dennis
fuente
Este gran método funcionó de manera extraordinaria para mí, sin embargo, no tuve que instalar ConfigTransform que menciona (que siempre transforma todas las configuraciones); simplemente establecí la configuración de compilación activa en Visual Studio (por ejemplo, la cambio para depurar), compilé la solución y voila!
BornToCode
5

Para hacer que la transformación funcione en desarrollo (usando F5 o CTRL + F5) coloco ctt.exe ( https://ctt.codeplex.com/ ) en la carpeta de paquetes (packages \ ConfigTransform \ ctt.exe).

Luego registro un evento previo o posterior a la compilación en Visual Studio ...

$(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config"
$(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)web.config" transform:"$(ProjectDir)web.$(ConfigurationName).config" destination:"$(ProjectDir)web.config"

Para las transformaciones utilizo la extensión SlowCheeta VS ( https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5 ).

Emanuel Nilsson
fuente
1
Para preservar los espacios en blanco (evita que la configuración transformada esté en una línea) agregue preservewhitespace indent IndentChars: "" a la línea de comando. $(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config" preservewhitespace indent IndentChars:" "
Emanuel Nilsson
3

Si va a reemplazar todas las cadenas de conexión con nuevas para el entorno de producción, simplemente puede reemplazar todas las cadenas de conexión con las de producción usando esta sintaxis:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

<connectionStrings xdt:Transform="Replace">
    <!-- production environment config --->
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Testing1" connectionString="Data Source=test;Initial Catalog=TestDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
</connectionStrings>
....

La información para esta respuesta se obtiene de esta respuesta y de esta publicación de blog .

aviso : como ya han explicado otros, esta configuración se aplicará solo cuando la aplicación se publique, no cuando se ejecute / depure (presionando F5).

VSB
fuente