Transformation : un Web.config par build facilement avec ASP.NET 4

De nombreuses fois, il m’aurait été utile de posséder mon Web.config en local pour mes tests en debug et un autre en production. Actuellement, il faut récupèrer le fichier sans écraser celui en local, le modifier et réuploader le tout — entre autres solutions. Pas compliqué en soit, mais pas très pratique non plus, on pourrait mieux faire. ASP.NET 4 nous apporte enfin cette fonctionnalité.

A la découverte des transformations

Commençons par créer une solution « Empty ASP.NET application » dans Visual Studio 2010. En se rendant sur notre Web.config, on remarque à quel point ce dernier a été épuré par rapport aux précédentes versions gagnant ainsi en clarté.

Web.config ASP.NET 4

Web.config ASP.NET 4

On voit dans notre exploreur de solution un changement aussi :

Project solution

Project solution

Nous avons notre Web.config comme avant, mais en plus avec cette nouvelle version, 2 autres sous fichiers sont apparus — un pour la build Debug et un autre pour le Release. Ces derniers sont des fichiers de « transformation » : en fonction de votre serveur, on utilisera le fichier Web.config correspondant à votre environemment.

Vous pouvez ajouter des fichiers de transformations en plus si vous en avez besoin en allant dans le menu Build → Configuration Manager. Par convention, nous mettons Web.[nom de la build].config.

Configuration Manager

Configuration Manager

Il faut ensuite rajouter le fichier de transformation en faisant clic droit sur notre Web.config puis « Add Config Transforms ».

Add Config Transforms

Add Config Transforms

Cela nous ajoutera un fichier de transformation Web.[nom de la build].config.

Exemple

Prenons le cas de notre chaîne de connexion. Nous avons notre base de données en local et une autre sur notre serveur de production. Notre Web.config ressemble donc à quelque chose comme cela pour l’instant avec notre base locale :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0"?>
 
<configuration>
 
    <connectionStrings>
        <add name="conn"
          connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=myDataBase;Integrated Security=True;Pooling=False"
          providerName="System.Data.SqlClient"/>
    </connectionStrings>
 
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
 
</configuration>

Modifions le fichiers de transformation pour notre build Release. La 1ère étape est de rajouter le namespace sur notre balise configuration (déjà le cas par défaut sur les fichiers créés avec la solution) puis d’ajouter notre nouvelle chaine de connexion comme ceci :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0"?>
 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
 
  <connectionStrings>
    <add name="conn"
      connectionString="Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;"
      providerName="System.Data.SqlClient"
      xdt:Transform="Replace"
      xdt:Locator="Match(name)" />
  </connectionStrings>
 
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>
</configuration>

Nous utilisons ici la transformation « Replace » (xdt:Transform=«Replace») afin de remplacer entièrement notre balise par la nouvelle spécifiée dans notre fichier de transformation grâce à la méthode « Match » (xdt:Locator=«Match(name)») de l’attibut « name ». Au final, notre moteur va rechercher notre chaîne de connexion qui porte le même nom dans le fichier Web.config de base, puis auquel cas le remplacer par la nouvelle spécifiée dans le fichier de transformation.

Nous pouvons voir aussi xdt:Transform=«RemoveAttributes(debug)» présent un peu plus bas. Il s’agit d’une transformation créée par défaut dans notre fichier. Celle-ci supprime l’attribut debug de notre élement compilation, non nécessaire en production.

Il existe plusieurs transformations possibles, elles sont détaillées sur la documentation MSDN.

Générer le Web.config

Afin de générer votre fichier Web.Config, ouvrez le Visual Studio Command prompt, puis saisir la commande

1
MSBuild 'path vers le .csproj/.vbProj' /t:TransformWebConfig /p:Configuration='build'"

Soit dans mon cas pour une build Release :

msbuild

msbuild

Cette commande génère la transformation du Web.Config dans le dossier obj/Release de votre projet. Il ne vous reste plus qu’à disposer votre fichier sur votre serveur.

Cette solution est beaucoup plus pratique que les solutions d’avant ASP.NET 4. Pour plus d’informations, je vous redonne le lien vers la documentation MSDN à propos des transformations.