web-dev-qa-db-fra.com

La transformation Web.config Build vs Release ne fonctionne pas

J'ai un projet d'application Web ASP.NET qui se connecte à une base de données distante via Entity Framework. Lors du débogage (par exemple lors de l’exécution du projet sur mon ordinateur local), l’adresse IP de la base de données est différente de celle utilisée lors de la publication (par exemple après le téléchargement du projet sur mon serveur Web et son exécution à partir du navigateur). Jusqu'à présent, j'avais toujours modifié manuellement la chaîne de connexion à la base de données dans le fichier Web.config pour basculer entre les deux (en gros, je devais établir des chaînes de connexion, l'une nommée 'Debug' et l'autre 'Release'. ).

Maintenant, je viens de remarquer qu'il devrait être possible de laisser cela se produire automatiquement via la syntaxe Web.config Transformation où vous placez la chaîne de connexion modifiée dans la version Web.Release.config. Elle devrait ensuite l'utiliser lorsque le DLL est construit sous Release configuration.

Cependant, cela ne semble pas fonctionner pour moi ...

Voici la partie pertinente de mon fichier Web.config habituel (qui contient la chaîne de connexion Debug pour une utilisation locale):

<?xml version="1.0"?>
<configuration>

  <connectionStrings>
    <!-- Debug connection string. Release connection string is in Web.Release.config file -->
    <add name="DatabaseEntities" connectionString="A" providerName="System.Data.EntityClient" />
  </connectionStrings>

</configuration>

Voici le fichier Web.Release.config qui, selon les exemples, devrait remplacer la chaîne de connexion "DatabaseEntities" "A" par "B" si le DLL est en mode de libération:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">

  <!-- Replace the DatabaseEntities connection string with the Release version (local IP address) -->
  <connectionStrings>
    <add name="DatabaseEntities"
      connectionString="B"
      xdt:Transform="Replace" xdt:Locator="Match(name)"/>
  </connectionStrings>

</configuration>

(Evidemment "A" et "B" ne sont que des espaces réservés pour mes vraies chaînes de connexion)

Lorsque je débogue l'application (par exemple, appuyez simplement sur F5), le fichier Web.config par défaut est utilisé et je peux accéder à la base de données. Je change ensuite la configuration de construction en version via le gestionnaire de configuration. Tous les projets de la solution sont définis sur Version de configuration. Ensuite, je construis la solution (juste via Build ou même via une reconstruction complète (par exemple, Clean, Rebuild)). Je télécharge les DLL nouvellement créées sur le serveur Web, ainsi que les fichiers Web.config et Web.Release.config. Lorsque j'essaie d'accéder à la base de données, je ne parviens pas à y accéder via l'adresse IP de débogage. et par conséquent ne peut pas le trouver ...

Il semble que le fichier Web.Release.config soit complètement ignoré, ou du moins que la chaîne de connexion ne soit pas remplacée.

Qu'est-ce que je fais mal? La syntaxe de transformation est-elle fausse? Est-ce que je ne construis pas correctement l'application en mode Release?

28
Nick Thissen

Ensuite, je construis la solution (juste via Build ou même via une reconstruction complète (Par exemple, Clean, Rebuild)). Je télécharge les DLL nouvellement créées dans le fichier serveur Web, ainsi que les fichiers Web.config et Web.Release.config

Il y a votre erreur: les transformations de configuration Web ne fonctionneront pas dans votre environnement local, si vous les construisez Vous devez publier.

Votre processus de déploiement semble étrange: vous ne copiez que les DLL, Web.config et web.Release.config. Il me semble que vous copiez votre code source et non une application compilée. Une application Web publiée ne contient pas web.release.config.

Vous devez publier votre projet (clic droit sur votre application Web -> Publier) sur votre système de fichiers local et copier les fichiers à partir de cet emplacement, ou utiliser une autre méthode de déploiement de votre choix.

Il y a 2 ans, j'ai écrit un article sur les transformations web.config. Vous y trouverez un didacticiel pas à pas pour VS 2010 (la boîte de dialogue de publication a été modifiée dans VS 2012): http://www.tomot.de/en-us/article/5/asp.net/how-to -use-web.config-transforme-pour-remplacer-appsettings-and-connectionstrings

51
citronas

Je pensais que la transformation n’était effectuée que lorsque vous publiez le site/l'application . Cela ne se fait pas lors de la création d'une application. Ce dernier changerait constamment le web.config sous contrôle de source (ce qui serait un vrai problème)

3
Tom Tavernier

Vous pouvez essayer le plugin Slow Cheetah:

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

Cela vous permettra de voir les transformations «en direct» en vous donnant une option de menu contextuel supplémentaire. Cliquez avec le bouton droit de la souris et choisissez Aperçu de la transformation pour voir la transformation sans avoir à construire. C'est aussi très pratique pour implémenter des transformations app.config

3
KerSplosh

Si seules les chaînes de connexion ne sont pas écrasées lors de la transformation web.config, voici ce que j'ai fait: sorcier. Ce paramètre remplaçait la transformation web.config de la chaîne de connexion.

1
SKos

C'est assez flexible, vous devriez pouvoir faire quelques ajustements pour appliquer des transformations personnalisées lors de la construction (et sans avoir à publier).

Nous avons implémenté cela dans notre projet (Windows Service), en appliquant des transformations à la construction

Vous devrez modifier votre fichier de projet et ajouter quelque chose de similaire à ci-dessous

Ici, nous demandons à msbuild d'appliquer la transformation après la compilation, mais uniquement si la condition est vraie (voir https://docs.Microsoft.com/en-us/visualstudio/msbuild/msbuild-conditions?view=vs-2017 )

Notez que nous utilisons un prop de construction (prop msbuild auto défini) "Env", par exemple. msbuild ... /p:Env=Prod donnerait App.Prod.config

<UsingTask TaskName="TransformXml" AssemblyFile="C:\Some\Path\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="Exists('some condition')">
  <!--Generate transformed app config in the intermediate directory-->
  <TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Env).config" />
  <!--Force build process to use the transformed configuration file from now on.-->
  <ItemGroup>
    <AppConfigWithTargetPath Remove="App.config" />
    <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
      <TargetPath>$(TargetFileName).config</TargetPath>
    </AppConfigWithTargetPath>
  </ItemGroup>
</Target>
0
Jason

Dans votre fichier csproj, vous pouvez ajouter une action à exécuter avant chaque construction et effectuer les transformations web.config:

<Target Name="BeforeBuild">
    <TransformXml Source="web.config" Transform="web.$(Configuration).config" Destination="web.config" />
</Target>
0
Hüseyin Yağlı