85 votes

Web.Config Debug/Release

Je sais que le fichier web.config de Visual Studio 2010 offre la possibilité de passer des bases de données du mode Debug au mode Release.

Voici mon 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>

Voici mon code 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>

Et voici mon code 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>

Lorsque je publie mon projet, rien ne s'affiche dans mon fichier Web.config. Il n'affiche pas la chaîne de connexion de ma base de données Live ?

138voto

Dillie-O Points 16780

Les transformations web.config qui font partie de Visual Studio 2010 utilisent XSLT afin de "transformer" le fichier web.config actuel en sa version .Debug ou .Release.

Dans vos fichiers .Debug/.Release, vous devez ajouter le paramètre suivant dans vos champs de chaîne de connexion :

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

Ainsi, chaque ligne de la chaîne de connexion trouvera le nom correspondant et mettra à jour les attributs en conséquence.

Remarque : vous n'aurez pas à vous soucier de la mise à jour du paramètre providerName dans les fichiers de transformation, puisqu'ils ne changent pas.

Voici un exemple tiré d'une de mes applications. Voici la section du fichier web.config :

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

Et voici la section web.config.release qui fait la bonne transformation :

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

Une remarque supplémentaire : les transformations ne se produisent que lorsque vous publiez le site, pas lorsque vous l'exécutez simplement avec F5 ou CTRL+F5. Si vous avez besoin d'exécuter une mise à jour contre une configuration donnée localement, vous devrez modifier manuellement votre fichier Web.config pour cela.

Pour plus de détails, vous pouvez consulter la documentation MSDN

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

21 votes

Pouvez-vous ajouter à la réponse une note indiquant que cela se produit en temps de publication et non en temps de F5 ? Apparemment, j'avais raison depuis 2 heures, mais je ne l'avais pas réalisé.

0 votes

Comment puis-je faire en sorte que cela fonctionne avec Visual Studio Online Continuous Build ? Je veux qu'il transforme ma Web.Config pendant la construction et le déploiement vers Azure.

1 votes

@RosdiKasim - Je ne suis pas sûr que cela corresponde à 100% à Visual Studio online, mais lorsque j'ai besoin de déployer un projet spécifique (si j'en ai plusieurs) ou d'utiliser une construction différente (et donc une transformation), je spécifie les choses directement dans l'instance du site web Azure. Voici quelques détails que j'ai écrits à ce sujet il y a quelque temps : freshconsulting.com/

13voto

nathan gonzalez Points 5866

Veuillez regarder cette vidéo de scott hanselman . non seulement c'est divertissant, mais c'est vraiment, vraiment informatif sur le nouveau paquet de déploiement en général.

8voto

Dennis Points 9534

Il est possible d'utiliser ConfigTransform disponible sous la forme d'un paquet Nuget - https://www.nuget.org/packages/CodeAssassin.ConfigTransform/

Tous les "web". * Les fichiers de transformation ".config" seront transformés et sortis sous la forme d'une série de fichiers "web.*.config.transformed" dans le répertoire de sortie de la construction indépendamment de la configuration de construction choisie.

Il en va de même pour les fichiers de transformation "app.*.config" dans les projets non web. non web.

et ensuite ajouter la cible suivante à votre *.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>

Je poste une réponse car c'est le premier message Stackoverflow qui apparaît dans Google sur le sujet.

0 votes

Cette méthode géniale a parfaitement fonctionné pour moi. Cependant, je n'ai pas eu à installer le NuGet ConfigTransform que vous avez mentionné (qui a pour effet de toujours transformer toutes les configurations). J'ai simplement copié le snippet cible de votre réponse dans le csproj. Ensuite, lorsque je définis la configuration de construction active dans Visual Studio (par exemple, en la changeant en configuration de débogage), la transformation est effectuée en conséquence lorsque je construis la solution.

5voto

Emanuel Nilsson Points 51

Pour faire fonctionner la transformation en développement (en utilisant F5 ou CTRL + F5), je dépose ctt.exe ( https://ctt.codeplex.com/ ) dans le dossier des paquets (packages \ConfigTransform\ctt.exe ).

Puis j'enregistre un événement pré- ou post-construction dans 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"

Pour les transformations, j'utilise l'extension SlowCheeta VS ( https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5 ).

1 votes

Afin de préserver les espaces blancs (empêche la configuration transformée d'être sur une seule ligne), ajoutez preservewhitespace indent IndentChars :" " à la ligne de commande. $(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationNam‌​e).config" destination:"$(ProjectDir)connectionStrings.config" preservewhitespace indent IndentChars:" "

3voto

VSB Points 878

Si vous devez remplacer toutes les chaînes de connexion avec les nouvelles pour l'environnement de production, vous pouvez simplement remplacer toutes les chaînes de connexion avec celles de production en utilisant cette syntaxe :

<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>
....

Les informations pour cette réponse proviennent de cette réponse et cet article de blog .

avis : Comme d'autres l'ont déjà expliqué, ce paramètre s'appliquera uniquement lors de la publication de l'application et non lors de son exécution/débogage (en appuyant sur F5).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X