Utilisation de Web.config différent dans un environnement de développement et de production

194

J'ai besoin d'utiliser une chaîne de connexion de base de données et une adresse de serveur SMTP différentes dans mon application ASP.NET selon qu'elle est exécutée dans un environnement de développement ou de production.

L'application lit les paramètres du fichier Web.config via la propriété WebConfigurationManager.AppSettings .

J'utilise la commande Build / Publish pour déployer l'application sur le serveur de production via FTP, puis je remplace manuellement Web.config distant par un correct.

Est-il possible de simplifier en quelque sorte le processus de déploiement? Merci!

Alexander Prokofyev
la source

Réponses:

159

Dans Visual Studio 2010 et versions ultérieures, vous avez désormais la possibilité d'appliquer une transformation à votre web.config en fonction de la configuration de génération.

Lors de la création d'un web.config, vous pouvez développer le fichier dans l'explorateur de solutions et vous verrez deux fichiers:

  • Web.Debug.Config
  • Web.Release.Config

Ils contiennent un code de transformation qui peut être utilisé pour

  • Changer la chaîne de connexion
  • Supprimer la trace et les paramètres de débogage
  • Enregistrer les pages d'erreur

Voir Syntaxe de transformation Web.config pour le déploiement de projet d'application Web sur MSDN pour plus d'informations.

Il est également possible, bien que officiellement non pris en charge, d'appliquer le même type de transformation à un app.configfichier d' application non Web . Voir le blog de Phil Bolduc sur la façon de modifier votre fichier de projet pour ajouter une nouvelle tâche à msbuild.

Il s'agit d'une demande de longue durée sur Visual Studio Uservoice .

Une extension pour Visual Studio 2010 et supérieur, « SlowCheetah », est disponible pour prendre en charge la création de la transformation pour tout fichier de configuration. À partir de Visual Studio 2017.3, SlowCheetah a été intégré à l'EDI et la base de code est gérée par Microsoft. Cette nouvelle version prend également en charge la transformation JSON.

Pierre-Alain Vigeant
la source
7
Notez que cela ne fonctionne pas pour les anciens projets de sites Web . Uniquement pour les applications Web . Je n'ai pas essayé de voir si la solution de contournement de Phil Bolduc fonctionne pour les sites Web, mais je soupçonne que non, car ils n'ont pas de fichiers de projet.
mo.
13
Notez également que web.confg transforme le travail pour la PUBLICATION uniquement, il ne fonctionne pas si vous construisez / exécutez simplement F5: (((
Alex
7
Si votre web.config ne contient pas de Web.Debug.Configet Web.Release.Config, vous devrez peut-être cliquer Web.Configavec le bouton droit et cliquer Add Config Transforms.
Doug S
1
@Alex: comment pouvons-nous l'utiliser pour une construction simple / F5?
parieur du
1
lien direct vers SlowCheetah: marketplace.visualstudio.com/…
Xiao
83

La <appSettings>balise dans web.config prend en charge un attribut de fichier qui chargera une configuration externe avec son propre ensemble de clés / valeurs. Ceux-ci remplaceront tous les paramètres que vous avez dans votre web.config ou y ajouteront.

Nous en profitons en modifiant notre web.config au moment de l'installation avec un attribut de fichier qui correspond à l'environnement sur lequel le site est installé. Nous le faisons avec un interrupteur sur notre installateur.

par exemple;

<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">

<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">

<appSettings file=".\EnvironmentSpecificConfigurations\production.config">

Remarque:

  • Les modifications apportées au .config spécifié par l'attribut ne déclencheront pas un redémarrage du processus de travail asp.net
Jason Slocomb
la source
2
C'est une excellente réponse, surtout lorsque vous avez une grande quantité d'environnements et que certains paramètres de certains environnements ont des mots de passe et similaires que vous ne souhaitez pas suivre dans le contrôle de code source.
Phil
1
Existe-t-il un moyen dynamique de changer le chemin du fichier? Sur la base de quel serveur vous êtes? Juste une note secondaire, cela fonctionne sur un ancien projet de site Web, pas sur une application Web. Alors merci!
Perspective du
2
Il existe un attribut restartOnExternalChangesqui traitera ces fichiers comme s'ils étaient web.configs. Source: learnable.com/books/…
David Schwartz
24

Avez-vous regardé des projets de déploiement Web?

http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en

Il existe également une version pour VS2005, si vous n'êtes pas en 2008.

wulimaster
la source
Ceci est un bon guide pour l'utilisation de projets de déploiement Web: johnnycoder.com/blog/2010/01/07/…
Gary W
Les projets de déploiement Web semblent être VS "Profils de publication" maintenant diaryofaninja.com/blog/2012/08/26/…
jocull
13

J'aimerais aussi savoir. Cela aide à isoler le problème pour moi

<connectionStrings configSource = "connectionStrings.config" />

Je garde ensuite un connectionStrings.config ainsi qu'un "{host} connectionStrings.config". C'est toujours un problème, mais si vous le faites pour des sections qui diffèrent dans les deux environnements, vous pouvez déployer et versionner le même web.config.

(Et je n'utilise pas VS, btw.)

harpo
la source
Si vous utilisez VS, vous pouvez utiliser des événements de pré-génération pour copier à partir d'un fichier debug.connectionstrings.config ou d'un fichier release.connectionstrings.config comme: copier $ (ProjectDir) $ (ConfigurationName) ConnectionStrings.config $ (ProjectDir) ConnectionStrings.config comme suggéré par Scott. Hanselmann: hanselman.com/blog/…
Thomas
6

J'utilise un script de construction NAnt pour déployer dans mes différents environnements. Je le fais modifier mes fichiers de configuration via XPath en fonction de l'endroit où ils sont déployés, puis il les place automatiquement dans cet environnement à l'aide de Beyond Compare .

La configuration prend une ou deux minutes, mais vous ne devez le faire qu'une seule fois. Ensuite, les fichiers batch prennent le relais pendant que je vais prendre une autre tasse de café. :)

Voici un article que j'ai trouvé dessus.

Jeff Sheldon
la source
5

Sur un projet où nous avions 4 environnements (développement, test, staging et production), nous avons développé un système où l'application a sélectionné la configuration appropriée en fonction du nom de la machine sur laquelle elle a été déployée.

Cela a fonctionné pour nous parce que:

  • les administrateurs pouvaient déployer des applications sans impliquer les développeurs (une exigence) et sans avoir à manipuler les fichiers de configuration (qu'ils détestaient);
  • les noms des machines respectaient une convention. Nous avons comparé les noms à l'aide d'une expression régulière et déployé sur plusieurs machines dans un environnement; et
  • nous avons utilisé la sécurité intégrée pour les chaînes de connexion. Cela signifie que nous pourrions conserver les noms de compte dans nos fichiers de configuration au moment de la conception sans révéler aucun mot de passe.

Cela a bien fonctionné pour nous dans ce cas, mais ne fonctionnerait probablement pas partout.

dariom
la source
3

L'éditeur de configuration Enterprise Library peut vous y aider. Il vous permet de créer un fichier de configuration de base, puis des deltas pour chaque environnement. Vous pouvez ensuite fusionner la configuration de base et le delta pour créer un web.config spécifique à l'environnement. Jetez un œil aux informations ici qui vous permettront de les parcourir mieux que moi.

PhilPursglove
la source
3

Vous pouvez également en faire une étape post-génération. Installez une nouvelle configuration qui est "Déployer" en plus du débogage et de la version, puis copiez l'étape de post-génération sur le web.config correct.

Nous utilisons des builds automatisés pour tous nos projets, et avec ceux-ci, le script de build met à jour le fichier web.config pour pointer vers l'emplacement correct. Mais cela ne vous aidera pas si vous faites tout de VS.

Cory Foy
la source
3

C'est l'un des énormes avantages de l'utilisation de machine.config. Lors de mon dernier emploi, nous avions des environnements de développement, de test et de production. Nous pourrions utiliser machine.config pour des choses comme les chaînes de connexion (vers la machine SQL appropriée, dev / test / prod).

Cela peut ne pas être une solution pour vous si vous n'avez pas accès à la machine de production réelle (comme si vous utilisiez une société d'hébergement sur un hôte partagé).

Timothy Khouri
la source
1

Vous pouvez également utiliser l'extension "Configuration Transform" fonctionne de la même manière que "SlowCheetah",

Parth Kale
la source
oui cela fonctionne mais uniquement sur le déploiement, pas sur la compilation, j'aimerais pouvoir simplement compiler et déboguer en utilisant différents environnements de transformation de configuration
Ch'nycos