wake-up-neo.com

Web.config Build vs. Release-Transformation funktioniert nicht

Ich habe ein ASP.NET-Webanwendungsprojekt, das über das Entity Framework eine Verbindung zu einer entfernten Datenbank herstellt. Während des Debugging (z. B. Ausführen des Projekts auf meinem lokalen Computer) unterscheidet sich die IP-Adresse der Datenbank von der während der Freigabe (z. B. nachdem das Projekt auf meinen Webserver hochgeladen und vom Browser aus ausgeführt wurde). Bis jetzt habe ich die Datenbankverbindungszeichenfolge in der Datei Web.config immer manuell geändert, um zwischen den beiden zu wechseln (im Grunde musste ich Verbindungszeichenfolgen benennen, eine mit dem Namen "Debug" und eine "Release"), und ich habe die Namen bei jeder Bereitstellung einfach ausgetauscht ).

Jetzt ist mir gerade aufgefallen, dass es möglich sein sollte, dies automatisch über die Web.config-Umwandlungssyntax ausführen zu lassen, in der Sie die geänderte Verbindungszeichenfolge in die Web.Release.config-Version einfügen und diese dann bei DLL wird unter Release-Konfiguration erstellt.

Es scheint jedoch nicht für mich zu arbeiten ... 

Hier ist der relevante Teil meiner regulären Web.config-Datei (die die Debug-Verbindungszeichenfolge für die lokale Verwendung enthält):

<?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>

Hier ist die Datei Web.Release.config, die gemäß den Beispielen die Verbindungszeichenfolge "A" der DatenbankEntities "A" durch "B" ersetzen soll, wenn sich die DLL im Freigabemodus befindet:

<?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>

(Offensichtlich sind "A" und "B" nur Platzhalter für meine echten Verbindungszeichenfolgen.)

Beim Debuggen der Anwendung (z. B. durch Drücken von F5) wird die Standardeinstellung Web.config verwendet, und ich kann auf die Datenbank zugreifen. Dann ändere ich die Build-Konfiguration über den Konfigurationsmanager auf Freigeben. Alle Projekte in der Lösung sind auf Konfiguration freigeben eingestellt. Dann baue ich die Lösung auf (einfach über Build oder sogar über eine vollständige Neuerstellung (z. B. Clean, Rebuild)). Ich lade die neu erstellten DLLs auf den Webserver sowie die Dateien Web.config und Web.Release.config hoch. Wenn ich versuche, auf die Datenbank zuzugreifen, kann ich nicht über die Debug-IP-Adresse auf die Datenbank zugreifen und kann es daher nicht finden ...

Es scheint, dass die Datei Web.Release.config vollständig ignoriert wird oder zumindest die Verbindungszeichenfolge nicht ersetzt wird. 

Was mache ich falsch? Ist die Transformationssyntax falsch? Baue ich die Anwendung nicht korrekt im Freigabemodus? 

28
Nick Thissen

Dann baue ich die Lösung auf (einfach über Build oder sogar über eine vollständige .__-Wiederherstellung (z. B. Clean, Rebuild)). Ich lade die neu erstellten DLLs in die Webserver sowie die Dateien Web.config und Web.Release.config

Es ist ein Fehler aufgetreten: Webkonfigurationsumwandlungen funktionieren in Ihrer lokalen Umgebung nicht, wenn Sie einfach erstellen. Sie müssen veröffentlichen.

Ihr Bereitstellungsprozess scheint seltsam: Sie kopieren nur DLLs, Web.config und web.Release.config. Mir scheint, dass Sie Ihren Quellcode kopieren und nicht eine kompilierte Anwendung. Eine veröffentlichte Webanwendung enthält keine web.release.config.

Sie sollten Ihr Projekt (rechte Maustaste auf Ihrer WebApplication -> Publish) in Ihrem lokalen Dateisystem veröffentlichen und die Dateien von dort kopieren oder eine andere Bereitstellungsmethode Ihrer Wahl verwenden.

Vor 2 Jahren schrieb ich einen Artikel über Transformationen von web.config. Sie erhalten eine schrittweise Anleitung für VS 2010 (Der Veröffentlichungsdialog wurde in VS 2012 geändert): http://www.tomot.de/en-us/article/5/asp.net/how-to -use-web.config-transforms-ersetzen-appsettings-und-connectionstrings

51
citronas

Ich dachte, Transformation wird nur gemacht, wenn Sie die Site/App veröffentlichen. __ Sie wird nicht beim Erstellen einer Anwendung ausgeführt. Letzteres würde die web.config ständig unter Quellcodeverwaltung ändern (was sehr mühsam wäre)

3
Tom Tavernier

Sie können das Slow Cheetah Plugin ausprobieren:

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

Dadurch können Sie die Transformationen "live" sehen, indem Sie eine zusätzliche Kontextmenüoption erhalten. Klicken Sie mit der rechten Maustaste und wählen Sie "Vorschau der Transformation", um die Transformation anzuzeigen, ohne einen Build durchführen zu müssen. Es ist auch sehr praktisch für die Implementierung von app.config-Transformationen

3
KerSplosh

Wenn es nur Verbindungszeichenfolgen sind, die während der Umwandlung von web.config nicht überschrieben werden, habe ich Folgendes getan: Ich habe das Kontrollkästchen "Diese Verbindungszeichenfolge zur Laufzeit verwenden" im Abschnitt "Einstellungen" von "Web veröffentlichen" deaktiviert Magier. Diese Einstellung überschrieb die web.config-Umwandlung der Verbindungszeichenfolge.

1
SKos

Es ist ziemlich flexibel. Sie sollten in der Lage sein, einige Anpassungen vorzunehmen, um benutzerdefinierte Transformationen auf Build anzuwenden (und dies ohne Veröffentlichung).

Wir haben dies in unserem (Windows Service) -Projekt implementiert und Transformationen auf Build angewendet

Sie müssen Ihre Projektdatei ändern und etwas ähnliches wie unten hinzufügen

Hier wird msbuild empfohlen, die Transformation nach dem Kompilieren anzuwenden, jedoch nur, wenn die Bedingung erfüllt ist (siehe https://docs.Microsoft.com/en-us/visualstudio/msbuild/msbuild-conditions?view=vs-2017) )

Beachten Sie, dass wir eine Build-Requisite (selbst definierte Msbuild-Requisite) "Env" verwenden, z. msbuild ... /p:Env=Prod würde zu App.Prod.config führen.

<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

In Ihrer csproj-Datei können Sie eine Aktion hinzufügen, die vor jedem Build ausgeführt wird, und die Umwandlungen web.config ausführen:

<Target Name="BeforeBuild">
    <TransformXml Source="web.config" Transform="web.$(Configuration).config" Destination="web.config" />
</Target>
0