Web Config Transform ne fonctionne pas

Dans une application .NET MVC 3.0, j’ai la configuration suivante dans appSettings :

web.config

        

Pour le débogage, la transformation de configuration suivante est définie:

web.Debug.config

    

Et je lance l’application en mode débogage, mais mon port SMTP prend toujours la valeur de web.config , pas de web.Debug.config .

Quelqu’un peut-il suggérer ce qui pourrait être faux dans cette configuration?

Les transformations Web.config ne sont appliquées que dans le cadre d’une opération de publication.

Si vous souhaitez que cela se fasse dans le cadre de l’opération de construction, vous pouvez utiliser le plug-in SlowCheetah – XML ​​Transforms Visual Studio:

http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

Visual Studio (2010 – 2017) ne le supporte malheureusement pas directement pendant le débogage, il est uniquement destiné à la publication – même avec l’extension SlowCheetah (réponse marquée), cela ne fonctionne pas pour moi (uniquement pour les projets utilisant app.config plutôt que web.config).

Notez qu’il existe une solution de contournement décrite à codeproject .

Il décrit comment modifier le fichier .msproj pour remplacer le fichier web.config actuel par la version transformée.

Je décrirai d’abord cette solution en tant qu’option 1 , mais j’ai récemment trouvé une autre option 2 , plus facile à utiliser (vous pouvez donc faire défiler l’option 2 directement si vous le souhaitez):


Option 1: J’ai ajouté les instructions tirées de l’ article original de codeproject (voir le lien ci-dessus), car les captures d’écran sont déjà parties et je ne veux pas perdre l’intégralité des informations:

VS.Net ne fait aucune transformation lorsque vous développez et déboguez simplement votre environnement local. Mais vous pouvez faire certaines démarches pour que cela se produise si vous le souhaitez.

  • Tout d’abord, créez les configurations souhaitées dans VS.Net , en supposant que le débogage et la version par défaut ne suffisent pas pour ce que vous essayez d’accomplir.
  • Faites un clic droit sur votre web.config et sélectionnez Ajouter des transformations de configuration – cela créera une configuration de transformation dépendante pour chacune de vos configurations définies.
  • Maintenant, vous pouvez renommer votre web.config en web.base.config .
  • Ajoutez un web.config à votre projet. Peu importe ce qu’il contient, il sera écrasé à chaque fois que nous construisons, mais nous voulons que cela fasse partie du projet, donc VS.Net ne nous donne pas le popup “Votre projet n’est pas configuré pour le débogage”. en haut
  • Modifiez votre .csproj projet .csproj et ajoutez la tâche TransformXml suivante à la cible AfterBuild. Ici, vous pouvez voir que je vais transformer le fichier web.base.config en utilisant le fichier web.[configuration].config et qu’il l’enregistrera sous le nom web.config . Pour plus de détails, veuillez consulter ce Microsoft Q & A et pour obtenir des instructions sur la manière d’étendre la version, regardez -le .

Option 2:

Sur la base de cette réponse, j’ai développé une application console simple, TransformConfig.exe (dans la syntaxe C # 6.0):

 using System; using System.Linq; using Microsoft.Web.XmlTransform; namespace TransformConfig { class Program { static int Main(ssortingng[] args) { var myDocumentsFolder = $@"C:\Users\{Environment.UserName}\Documents"; var myVsProjects = $@"{myDocumentsFolder}\Visual Studio 2015\Projects"; ssortingng srcConfigFileName = "Web.config"; ssortingng tgtConfigFileName = srcConfigFileName; ssortingng transformFileName = "Web.Debug.config"; ssortingng basePath = myVsProjects + @"\"; try { var numArgs = args?.Count() ?? 0; if (numArgs == 0 || args.Any(x=>x=="/?")) { Console.WriteLine("\nTransformConfig - Usage:"); Console.WriteLine("\tTransformConfig.exe /d:tgtConfigFileName [/t:transformFileName [/s:srcConfigFileName][/b:basePath]]"); Console.WriteLine($"\nIf 'basePath' is just a directory name, '{basePath}' is preceeded."); Console.WriteLine("\nTransformConfig - Example (inside PostBuild event):"); Console.WriteLine("\t\"c:\\Tools\\TransformConfig.exe\" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config /b:\"$(ProjectDir)\\\""); Environment.ExitCode = 1; return 1; } foreach (var a in args) { var param = a.Trim().Subssortingng(3).TrimStart(); switch (a.TrimStart().Subssortingng(0,2).ToLowerInvariant()) { case "/d": tgtConfigFileName = param ?? tgtConfigFileName; break; case "/t": transformFileName = param ?? transformFileName; break; case "/b": var isPath = (param ?? "").Contains("\\"); basePath = (isPath == false) ? $@"{myVsProjects}\" + param ?? "" : param; break; case "/s": srcConfigFileName = param ?? srcConfigFileName; break; default: break; } } basePath = System.IO.Path.GetFullPath(basePath); if (!basePath.EndsWith("\\")) basePath += "\\"; if (tgtConfigFileName != srcConfigFileName) { System.IO.File.Copy(basePath + srcConfigFileName, basePath + tgtConfigFileName, true); } TransformConfig(basePath + tgtConfigFileName, basePath + transformFileName); Console.WriteLine($"TransformConfig - transformed '{basePath + tgtConfigFileName}' successfully using '{transformFileName}'."); Environment.ExitCode = 0; return 0; } catch (Exception ex) { var msg = $"{ex.Message}\nParameters:\n/d:{tgtConfigFileName}\n/t:{transformFileName}\n/s:{srcConfigFileName}\n/b:{basePath}"; Console.WriteLine($"TransformConfig - Exception occurred: {msg}"); Console.WriteLine($"TransformConfig - Processing aborted."); Environment.ExitCode = 2; return 2; } } public static void TransformConfig(ssortingng configFileName, ssortingng transformFileName) { var document = new XmlTransformableDocument(); document.PreserveWhitespace = true; document.Load(configFileName); var transformation = new XmlTransformation(transformFileName); if (!transformation.Apply(document)) { throw new Exception("Transformation Failed"); } document.Save(configFileName); } } } 

Assurez-vous d’append comme référence la DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll" (cet exemple s’applique à VS 2015 pour les anciennes versions). remplacez le v14.0 dans le chemin par le numéro de version approprié, par exemple v11.0 ).

Pour Visual Studio 2017, le schéma d’atsortingbution de nom du chemin a changé: Par exemple, pour la version d’entreprise, c’est ici: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web .
Je suppose que pour la version professionnelle, vous devez remplacer Enterprise par Professional . Si vous utilisez la version d’aperçu, remplacez également 2017 par Preview .

Comstackz-le et placez le fichier .exe dans un répertoire, par exemple C:\MyTools\ .

Utilisation: vous pouvez l’utiliser dans votre événement de post-construction (dans les propriétés du projet , sélectionnez Construire des événements , puis modifiez la ligne de commande de l’événement post-génération ). Les parameters de la ligne de commande sont (exemple):

“C: \ MyTools \ TransformConfig.Exe” /d:Web.config /t:Web.$(ConfigurationName ).config /s:Web.Template.config / b: “$ (ProjectDir) \”

c’est-à-dire d’abord le nom du fichier de configuration, suivi du fichier de configuration de transformation, suivi d’une configuration de modèle facultative, suivie du chemin d’access à votre projet contenant les deux fichiers.

J’ai ajouté le paramètre facultatif template config car sinon votre configuration complète d’origine serait remplacée par la transformation, ce qui peut être évité en fournissant un modèle.

Créez le modèle en copiant simplement le fichier Web.config d’origine et nommez-le Web.Template.config.

Remarque:

  • Si vous préférez, vous pouvez également copier le fichier TransformConfig.exe dans le chemin Visual Studio mentionné ci-dessus où réside Microsoft.Web.XmlTransform.dll et y faire référence dans tous vos projets où vous devez transformer vos configurations.

  • Pour ceux d’entre vous qui se demandent pourquoi j’ai ajouté Environment.ExitCode = x; assignations: Le simple retour d’un int depuis Main n’a pas aidé dans l’événement de construction. Voir les détails ici.

  • Si vous publiez votre projet et que vous utilisez Web.Template.config, assurez-vous d’avoir effectué une reconstruction sur votre solution avec la configuration appropriée (généralement la version) avant de la publier. La raison en est que Web.Config est écrasé lors du débogage et que vous risquez de transformer le mauvais fichier autrement.

Répondre à votre question n’est pas simple, car cela pose un problème – si vous voulez transformer Web.config avec Web.debug.config – où l’effet de transformation doit être stocké? Dans Web.config lui-même? Cela écraserait le fichier source de la transformation! C’est probablement pour cela que Visual Studio ne fait pas de transformations pendant les builds.

La réponse précédente de Matt est valide, mais vous voudrez peut-être les combiner pour avoir une solution générique qui fonctionne lorsque vous modifiez réellement la configuration de solution active du débogage à la publication, etc. Voici une solution simple:

  1. Créez vos transformations de configuration pour les configurations (Debug, Release, etc.)
  2. Renommez le fichier Web.config en Web.base.config – les transformations doivent automatiquement être renommées en conséquence ( Web.base.Debug.config , etc.)
  3. Ajoutez le fichier XML suivant transformWebConfig.proj dans votre dossier de projet:
        
  1. Accédez aux propriétés de votre projet, choisissez Build Events et ajoutez le contenu suivant à la ligne de commande de l’événement Post-build :
 @if exist "%ProgramFiles(x86)%\MSBuild\12.0\bin" set PATH=%ProgramFiles(x86)%\MSBuild\12.0\bin;%PATH% msbuild $(ProjectDir)transformWebConfig.proj /t:TransformWebConfig /p:CurrentConfig=$(ConfigurationName) /p:TargetProjectName=$(TargetPath) 

Maintenant, lorsque vous créez votre solution, un fichier Web.config sera créé avec des transformations valides pour la configuration active.

Votre question immédiate a reçu une réponse – l’explication est que la transformation est appliquée à la publication, pas à la génération.

Cependant, je pense qu’il n’offre pas de solution pour réaliser ce que vous voulez faire.

Je me suis débattu avec ce problème pendant quelques jours maintenant, à la recherche d’un moyen de garder web.config propre et de définir toutes les clés qui varient selon l’environnement dans les fichiers de transformation respectifs. Ma conclusion est que la solution la plus simple et la plus stable consiste à utiliser les valeurs de débogage dans le fichier web.config d’origine, de sorte qu’elles soient toujours présentes lorsque vous exécutez des exécutions de débogage dans Visual Studio.

Créez ensuite des transformations pour les différents environnements que vous souhaitez publier: test, intégration, production, etc. La fonctionnalité maintenant intégrée pour transformer les fichiers web.config lors de la publication suffit pour cela. Pas besoin de SlowCheetah ou d’éditer des événements de build ou des fichiers de projet. Si vous ne possédez que des projets Web.

Si vous le souhaitez, vous pouvez également avoir le fichier web.debug.config dans votre solution, simplement pour conserver un fichier séparé avec toutes les valeurs relatives à l’environnement de développement. N’oubliez pas de commenter que les valeurs ne sont pas appliquées lors de l’exécution dans Visual Studio, au cas où quelqu’un d’autre essaierait de l’utiliser à cette fin!

Utilisez Octopus Deploy (l’édition de la communauté est gratuite) et laissez-la transformer le web.config pour vous. Pas:

  1. Configurez Octopus pour déployer votre application Web
  2. Assurez-vous que votre Web.Release.config a la propriété Build Action définie sur Content tout comme votre fichier web.config principal.

C’est tout! Octopus fera le rest sans aucune configuration spéciale. Un déploiement de site Web IIS par défaut le fera automatiquement: entrer la description de l'image ici

Apparemment, il y a une extension pour Visual Studio 2015

https://visualstudiogallery.msdn.microsoft.com/05bb50e3-c971-4613-9379-acae2cfe6f9e

Ce package vous permet de transformer votre fichier app.config ou tout autre fichier XML en fonction de la configuration de la construction

Récemment, j’ai rencontré le même problème avec un fichier web.config plus ancien basé sur .NET Framework 2.0. La solution était simplement de supprimer l’espace de noms de web.config ( xmlns attibute dans le noeud racine de configuration ):

AVANT:

APRÈS: