Die 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.
Anschließend muss das Web Projekt "abgekoppelt" werden
(Solution Explorer -> Context Menü des Projektes -> Unload Project), …
… um die Projektdatei editieren zu können
(Solution Explorer -> Context Menü des Projektes -> 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.
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:
Nach den Änderungen werden im Compute Emulator und auch in der Cloud die Richtigen Werte angezeigt:
Weitere Informationen
Verwendete Bildquellen:
© Klicker / PIXELIO