ASP.NET

Knowledge Base

ASP.NET > Deployment / Build

Wie ändert / transformiert man die web.config für die Produktion?

Die web.config unterscheidet sich in der Regel zwischen Entwicklungs-, Test- und Produktionserver - d. h. vor der (Software-)Verteilung (deployment) muss diese entsprechend angepasst werden.

Es empfiehlt sich, dies automatisch (beim "Veröffentlichungsvorgang" (publish)) durchzuführen und nicht manuell, weil nicht immer an alle Änderungen gedacht wird und Fehler in der web.config dazu führen, dass die Web-Applikation im Zweifel nicht mehr aufgerufen werden kann oder evtl. Sicherheits- und Performanceprobleme entstehen (je nach Einstellung).

Microsoft hat in Visual Studio zusätzliche Optionen eingebaut, die die Veröffentlichung erleichtern und es ermöglichen, die  web.config mit Hilfe von XSD-Transformationen während der Veröffentlichung automatisiert anzupassen (z. B. für den Testserver oder für den Produktionsserver).

Dazu kann entsprechend zu jedem Veröffentlichungsprofile (publish profile) eine zugehörige Transformationsdatei erstellt werden.

Seit Visual Studio 2012 werden für Veröffentlichungsprofile msbuild-Konfigurationsdateien verwendet, die (im Web-Applikations-Projekt) unter \Properties\PublishProfiles\<profilname>.pubxml abgelegt werden. Diese werden entweder über direkt im XML-Editor oder über das Menü Erstellen > "<Projektname>" veröffentlichen (bzw. Build > Publish <projektname>) konfiguriert (es öffnet sich ein Popup zur Verwaltung der Profile). Der Vorteil des Popups ist, dass man die XML-Tags für die Konfiguration nicht kennen muss (Visual Studio kümmert sich darum). Der Vorteil durch die Verwaltung des XML-Editors ist, dass (msbuild-)Erweiterungen genutzt werden können, um den Build-Vorgang zu steuern - das ist allerdings ein anderes Thema ;-)

Für die Test oder Produktion lassen sich dann z. B. zwei Profile anlegen -> Testserver (Datei Testserver.pubxml) und Produktionsserver (Datei Produktionsserver .pubxml):

Publish-Profiles

Diese führen zu einem Build und Deploy der Anwendung aber nicht zu einer Transformation der web.config (sondern die Original web.config wird beim Build eingesetzt).

Um eine Transformation zu erreichen, muss für jedes Profil eine zusätzliche Datei mit dem Namen "web.<Profilename>.config" erstellt werden.

Im obigen Beispiel wurden bereits die Dateien web.Testserver.config und web.Produktionsserver.config hinzugefügt werden. Wird dann die Veröffentlichung über ein entsprechendes Profil <profilname> durchgeführt, dann werden auch die Transformationen der entsprechenden web.<profilname>.config durchgeführt (was auch im Output angegeben wird):

["Web.config" wurde mithilfe von "Web.Produktionsserver.config" in "obj\Release\ProfileTransformWebConfig\transformed\Web.config" transformiert]

bzw.

["Transformed Web.config using Web.Produktionsserver.config into obj\Release\ProfileTransformWebConfig\transformed\Web.config."]


Innerhalb einer Transformationsdatei kann man alle Änderungen durchführen (Ersetzen von Abschnitten, Entfernen einzelner Attribute, Hinzufügen von Abschnitten etc.) - Beispiele: 

Ersetzen von kompletten [ConnectionStrings]-Abschnitt:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <connectionStrings xdt:Transform="Replace">
        <add name="MeineVerbindung"
             connectionString="<ProduktionsConnectionString>" />
    </connectionStrings>  
</configuration>


Einzelnen [ConnectionString] ändern:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <connectionStrings>
        <add name="MeineVerbindung"
             connectionString="<ProduktionsConnectionString>"
             xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
    </connectionStrings>  
</configuration>

Ändert den ConnectionString mit dem Namen "MeineVerbindung" - nur die angebenen Attribute werden gesetzt bzw. überschrieben.


Debug-Attribute entfernen  (was der Standardeinstellung debug="false" entspricht):
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <system.web>
          <compilation xdt:Transform="RemoveAttributes(debug)" />
      </system.web>  
</configuration>


Weitere Transformationen