Dans certains projets, il est possible que vous ayez à partager un fichier de configuration web (web.config) entre plusieurs applications web afin d'avoir des informations communes. Pour se faire, la tâche n'est pas des plus compliquée. En effet, il suffit de placer le fichier de configuration plus haut dans la hiérarchie du site web IIS. Le système de mise en cache des fichiers de configuration de la plateforme .NET fait le reste, du machine.config (dans le dossier Config du .NET Framework) au plus bas fichier de votre application web.

L'écran ci-dessous illustre le cas de figure suscité :


Ici, je souhaite partager une information (l'age du capitaine) entre mes deux applications web, BackOffice et FrontOffice, toutes deux contenues dans le Site Web IIS "MyEnterpriseSite". Il faut donc que je place le fichier de configuration contenant l'information dans le répertoire de MyEnterpriseSite. Voici la section appSettings de ce fichier :

<appSettings>

<add key="CaptainAge" value="42" />

</appSettings>

 

Afin de s'assurer du fait que ce paramètre est bien visible dans les applications BackOffice et FrontOffice, nous allons y ajouter une page Default.aspx, contenant un Label dans lequel nous affichons l'âge du Capitaine par le biais de la classe WebConfigurationManager :

Default.aspx

CaptainAge : <asp:Label ID="CaptainAge" runat="server"></asp:Label>

Default.aspx.cs

this.CaptainAge.Text = WebConfigurationManager.AppSettings["CaptainAge"];

Si vous naviguez sur ces deux pages, vous constaterez que la valeur est bien partagée.

Il n'y a donc aucune difficulté à partager des informations entre deux applications web. En revanche, modifier cette information pour les deux applications depuis une des deux applications pourrait le devenir.

Poursuivons sur notre exemple et imaginons vouloir modifier l'âge du capitaine depuis l'application web BackOffice. Bien entendu, la modification doit être visible depuis le FrontOffice.

Traditionnellement, voilà ce que vous devez être tenté d'écrire dans le code behind de la page Default.aspx du BackOffice :

Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~");

AppSettingsSection appSettings = configuration.GetSection("appSettings") as AppSettingsSection;

 

if (appSettings.Settings["CaptainAge"] != null)

{

appSettings.Settings["CaptainAge"].Value = "84";

configuration.Save();

}

Et vous auriez raison (enfin presqueJ) puisque ce code va bien s'exécuter, mais créer un fichier de configuration dans l'application BackOffice, annuler l'héritage pour le paramètre « CaptainAge » et définir la nouvelle valeur :

<?xml version="1.0" encoding="utf-8"?>

<configuration>

<appSettings>

<remove key="CaptainAge" />

<add key="CaptainAge" value="84" />

</appSettings>

</configuration>

La valeur est bien modifiée, mais uniquement pour l'application BackOffice. Donc cela ne nous convient pas !

Pour mener à bien notre mission, nous allons devoir « remapper » le fichier de configuration, afin d'ouvrir celui du site MyEnterpriseSite. Nous allons utiliser pour cela une instance de la classe WebConfigurationFileMap  :

WebConfigurationFileMap fileMap = new WebConfigurationFileMap();

 

Nous créeons ensuite une instance de VirtualDirectoryMapping qui va permettre de mapper un path comme racine de l'application web pour la configuration :

VirtualDirectoryMapping mapping = new VirtualDirectoryMapping(@"C:\inetpub\myenterprisesiteroot", true);

 

On spécifie ci-dessus le chemin du répertoire ou se trouve le fichier de configuration à modifier. Il ne reste alors qu'à ajouter le mapping à la collection de VirtualDirectory de l'instance de WebConfigurationFileMap :

fileMap.VirtualDirectories.Add("/BackOffice", mapping);

On précise ici le chemin relatif de l'application web en cours. Nous n'avons plus qu'à ouvrir la configuration à l'aide de la méthode OpenMappedWebConfiguration de la classe WebConfigurationManager :

Configuration conf = WebConfigurationManager.OpenMappedWebConfiguration(fileMap, "/BackOffice", "MyEnterpriseSite");

La modification se passe traditionnellement :

AppSettingsSection appSettings = conf.GetSection("appSettings") as AppSettingsSection;

appSettings.Settings["CaptainAge"].Value = tbCaptainAge.Text;

 

conf.Save();

Cette fois-ci, pas de fichier de configuration supplémentaire créé et surtout, l'information a été modifiée pour les deux applications web, BackOffice et FrontOffice.

J'espère que ce poste pourra aider certains d'entre vous.

A bientôt Wink

Au total, 2 commentaire(s) posté(s) ! Poster un commentaire

comments Par Stéphane, le jeudi 13 novembre 2008 à 23:14 - quote

Stéphane Et voila Smile et on est content!

On pourrait donc avoir une arborescence d'applications partageant toutes (ou, au choix, partiellement) le même fichier de configuration.
Ce qui pourrait être intéressant serait d'encapsuler cette gestion dans une classe qui ferait tout ce travail pour nous Smile

Bien joué Bidou! Smile

comments Par Julien Corioland, le jeudi 13 novembre 2008 à 23:16 - quote

Julien Corioland Ouai c'est à pauffiner Smile

Disons que j'ai réussi mes tests ! Maintenant il faut l'implémenter correctement dans le projet.

A voir ;)

comments Ajouter un commentaire

(Affichera votre icône Gravatar)  
[b][/b] - [i][/i] - [u][/u]- [quote][/quote]