Freitag , 18 September 2020

Web.Config Transformation im Windows Azure Compute Emulator

move the worldDie Standardvorlagen für ASP.NET WebForms Projekte, sowie ASP.NET Web Rollen, werden mit einer Web.config Datei plus 2 Transformationsdateien ausgeliefert.
Wenn man diese allerdings im Windows Azure Compute Emulator betreibt, wird die Transformation offensichtlich nicht angewendet.

Die Ergebnisse von XML-Transformationen werden beim Kompiliervorgang im Ausgabeverzeichnis abgelegt.
Da der Windows Azure Compute Emulator allerdings direkt auf das Quellverzeichnis der Webapplikation zugreift, wird hierbei nur die original Web.config verwendet.

Um dies zu Ändern, geht man wie folgt vor:

 

Web.Config Dateien anpassen

Zu aller erst benötigt man eine Kopie der Web.config Datei.
Diese benennt man in Web.Original.config um.

Solution Explorer - Kopie der Web.Config

 

Anschließend muss das Web Projekt "abgekoppelt" werden
(Solution Explorer -> Context Menü des Projektes -> Unload Project), …

Solution Explorer - Context Menü - Unload Project

… um die Projektdatei editieren zu können
(Solution Explorer -> Context Menü des Projektes -> Open *.csproj).

Solution Explorer - Context Menü - Open *.csproj

 

In der geöffneten Projektdatei, muss jetzt der Eintrag für die Web.Original.config gefunden …

<Content Include="Web.Original.config"/>

 

… und wie folgt abgeändert werden:

<None Include="Web.Original.config">
  <DependentUpon>Web.config</DependentUpon>
</None>

 

Diese Änderung entfernt die Datei aus dem eigentlichen Build-Prozess und setzt sie in Abhängigkeit zur Web.config.

Solution Explorer - Web.Config - Nach den Änderungen

 

MSBuild Prozess anpassen

Danach muss noch der MSBuild Prozess erweitert werden.

Dazu fügt man am Ende der weiterhin geöffneten Projektdatei, und noch vor dem schließenden </Project> Tag, folgende MSBuild Anweisungen hinzu:

<Target Name="BeforeBuild">
  <MSBuild Condition=" '$(Configuration)' == 'Debug' " 
           Targets="TransformWebConfigTask" 
           Projects="$(MSBuildProjectFile)" />
  <MSBuild Condition=" '$(Configuration)' != 'Debug' " 
           Targets="CopyWebConfigTask" 
           Projects="$(MSBuildProjectFile)" />
</Target>
<Target Name="CopyWebConfigTask">
  <Copy SourceFiles="Web.Original.config" 
        DestinationFiles="Web.config" />
</Target>
<Target Name="TransformWebConfigTask">
  <TransformXml Source="Web.Original.config" 
                Transform="Web.$(Configuration).config" 
                Destination="Web.config" />
</Target>

 

Diese klinken sich vor dem eigentlichen Build Vorgang ein und führt, je nach aktiver Konfiguration, einen der folgenden Schritte aus:

  • Wenn die Debug Konfiguration aktiv ist, wird die Web.Original.config mit der aktiven (Debug) Transformationsdatei zu einer neuen Web.config transformiert.
  • Wenn eine andere Konfiguration aktiv ist, wird die Web.config mit dem Inhalt der Web.Original.config ersetzt, da diese beim Veröffentlichen bereits transformiert wird.

 

Source Control anpassen

Falls ein Source Control System, wie z.B. die Team Foundation Services oder der Team Foundation Server, im Einsatz ist, sollte man die Web.config aus dem Source Control ausschließen, da dies sich bei jedem Build Vorgang verändert.

Dazu kann man beim TFS die *.csproj.vspscc Datei wie folgt anpassen:

""
{
"FILE_VERSION" = "9237"
"ENLISTMENT_CHOICE" = "NEVER"
"PROJECT_FILE_RELATIVE_PATH" = ""
"NUMBER_OF_EXCLUDED_FILES" = "1"
"EXCLUDED_FILE0" = "Web.config"
"ORIGINAL_PROJECT_FILE_PATH" = ""
"NUMBER_OF_NESTED_PROJECTS" = "0"
"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
}

 

Beispielapplikation

Hierzu ein kleines Beispiel (Link zum Download befindet sich am Ende diese Blog Posts):

Dieses enthält in den Web.config Dateien einen <appSettings> Eintrag mit einem Test Wert der in der Default.aspx angezeigt wird.

Vor den o.g. Änderungen sieht die Webseite im Windows Azure Compute Emulator wie folgt aus:

Web Rolle - Vor den Änderungen

Nach den Änderungen werden im Compute Emulator und auch in der Cloud die Richtigen Werte angezeigt:

Web Rolle - Nach den Änderungen im Emulator

Web Rolle - Nach den Änderungen in der Cloud

 



Verwendete Bildquellen:
© Klicker / PIXELIO