Verwendung verschiedener Web.config in Entwicklungs- und Produktionsumgebungen

194

Ich muss in meiner ASP.NET-Anwendung unterschiedliche Datenbankverbindungszeichenfolgen und SMTP-Serveradressen verwenden, je nachdem, ob sie in einer Entwicklungs- oder Produktionsumgebung ausgeführt werden.

Die Anwendung liest Einstellungen aus der Datei Web.config über die Eigenschaft WebConfigurationManager.AppSettings .

Ich verwende den Befehl "Erstellen / Veröffentlichen", um die Anwendung über FTP auf dem Produktionsserver bereitzustellen und dann die entfernte Web.config manuell durch die richtige zu ersetzen.

Ist es möglich, den Bereitstellungsprozess irgendwie zu vereinfachen? Vielen Dank!

Alexander Prokofyev
quelle

Antworten:

159

In Visual Studio 2010 und höher können Sie jetzt abhängig von der Build-Konfiguration eine Transformation auf Ihre web.config anwenden.

Wenn Sie eine web.config erstellen, können Sie die Datei im Lösungs-Explorer erweitern, und es werden zwei Dateien angezeigt:

  • Web.Debug.Config
  • Web.Release.Config

Sie enthalten Transformationscode, der verwendet werden kann

  • Ändern Sie die Verbindungszeichenfolge
  • Entfernen Sie den Debugging-Trace und die Einstellungen
  • Registrieren Sie Fehlerseiten

Weitere Informationen finden Sie unter Web.config-Transformationssyntax für die Bereitstellung von Webanwendungsprojekten auf MSDN.

Es ist auch möglich, dieselbe Art der Transformation auf eine Nicht-Webanwendungsdatei anzuwenden, obwohl dies offiziell nicht unterstützt wird app.config. Weitere Informationen zum Ändern Ihrer Projektdatei, um msbuild eine neue Aufgabe hinzuzufügen, finden Sie im Phil Bolduc-Blog .

Dies ist eine lange anhaltende Anforderung an Visual Studio Uservoice .

Eine Erweiterung für Visual Studio 2010 und höher, " SlowCheetah ", ist verfügbar, um die Erstellung von Transformationen für jede Konfigurationsdatei zu übernehmen. Ab Visual Studio 2017.3 wurde SlowCheetah in die IDE integriert und die Codebasis wird von Microsoft verwaltet. Diese neue Version unterstützt auch die JSON-Transformation.

Pierre-Alain Vigeant
quelle
7
Beachten Sie, dass dies bei alten Website- Projekten nicht funktioniert . Nur für Web - Anwendungen . Ich habe nicht versucht festzustellen, ob die Problemumgehung von Phil Bolduc für Websites funktioniert, aber ich vermute, dass dies nicht der Fall ist, da sie keine Projektdateien haben.
mo.
13
Beachten Sie auch, dass web.confg-Transformationen nur für PUBLISHING funktionieren. Sie funktionieren nicht, wenn Sie einfach F5 erstellen / ausführen: ((((
Alex
7
Wenn Ihre web.config kein Web.Debug.Configund enthält Web.Release.Config, müssen Sie möglicherweise mit der rechten Maustaste klickenWeb.Config und klicken Add Config Transforms.
Doug S
1
@ Alex: Wie können wir es für einfaches Build / F5 verwenden?
Punter
1
direkter Link zu SlowCheetah: marketplace.visualstudio.com/…
Xiao
83

Das <appSettings>Tag in web.config unterstützt ein Dateiattribut, das eine externe Konfiguration mit einem eigenen Satz von Schlüsseln / Werten lädt. Diese überschreiben alle Einstellungen, die Sie in Ihrer web.config haben, oder fügen sie hinzu.

Wir nutzen dies, indem wir unsere web.config zur Installationszeit mit einem Dateiattribut ändern, das der Umgebung entspricht, in der die Site installiert wird. Wir tun dies mit einem Schalter auf unserem Installer.

z.B;

<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">

<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">

<appSettings file=".\EnvironmentSpecificConfigurations\production.config">

Hinweis:

  • Änderungen an der durch das Attribut angegebenen .config lösen keinen Neustart des asp.net-Arbeitsprozesses aus
Jason Slocomb
quelle
2
Dies ist eine hervorragende Antwort, insbesondere wenn Sie über eine große Anzahl von Umgebungen verfügen und einige Einstellungen für bestimmte Umgebungen Kennwörter und ähnliches enthalten, die in der Quellcodeverwaltung nicht nachverfolgt werden sollen.
Phil
1
Gibt es eine dynamische Möglichkeit, den Dateipfad zu ändern? Basierend auf welchem ​​Server sind Sie? Nur eine Randnotiz: Dies funktioniert bei einem alten Website-Projekt, nicht bei einer Webanwendung. Also vielen Dank!
Perspektive
2
Es gibt ein Attribut restartOnExternalChanges, das diese Dateien so behandelt, als wären sie web.configs. Quelle: learnable.com/books/…
David Schwartz
13

Ich würde es auch gerne wissen. Dies hilft mir, das Problem einzugrenzen

<connectionStrings configSource = "connectionStrings.config" />

Ich behalte dann eine connectionStrings.config sowie eine "{host} connectionStrings.config". Es ist immer noch ein Problem, aber wenn Sie dies für Abschnitte tun, die sich in den beiden Umgebungen unterscheiden, können Sie dieselbe web.config bereitstellen und versionieren.

(Und ich benutze übrigens kein VS.)

Harpo
quelle
Wenn Sie VS verwenden, können Sie Prebuild-Ereignisse verwenden, um wie vorgeschlagen aus einer debug.connectionstrings.config oder einer release.connectionstrings.config zu kopieren: copy $ (ProjectDir) $ (ConfigurationName) ConnectionStrings.config $ (ProjectDir) ConnectionStrings.config wie vorgeschlagen von Scott. Hanselmann: hanselman.com/blog/…
Thomas
6

Ich verwende ein NAnt Build Script, um es in meinen verschiedenen Umgebungen bereitzustellen. Ich habe meine Konfigurationsdateien über XPath geändert, je nachdem, wo sie bereitgestellt werden, und sie dann mithilfe von Beyond Compare automatisch in diese Umgebung gebracht .

Das Einrichten dauert ein oder zwei Minuten, aber Sie müssen es nur einmal tun. Dann übernehmen Batch-Dateien, während ich noch eine Tasse Kaffee hole. :) :)

Hier ist ein Artikel, den ich darauf gefunden habe.

Jeff Sheldon
quelle
5

In einem Projekt mit 4 Umgebungen (Entwicklung, Test, Staging und Produktion) haben wir ein System entwickelt, bei dem die Anwendung die entsprechende Konfiguration basierend auf dem Computernamen auswählte, auf dem sie bereitgestellt wurde.

Das hat bei uns funktioniert, weil:

  • Administratoren konnten Anwendungen bereitstellen, ohne Entwickler einzubeziehen (eine Anforderung) und ohne mit Konfigurationsdateien herumspielen zu müssen (die sie hassten).
  • Maschinennamen hielten sich an eine Konvention. Wir haben Namen mithilfe eines regulären Ausdrucks abgeglichen und auf mehreren Computern in einer Umgebung bereitgestellt. und
  • Wir haben integrierte Sicherheit für Verbindungszeichenfolgen verwendet. Dies bedeutet, dass wir zur Entwurfszeit Kontonamen in unseren Konfigurationsdateien behalten können, ohne Kennwörter preiszugeben.

In diesem Fall hat es für uns gut funktioniert, aber wahrscheinlich nicht überall.

Dariom
quelle
3

Der Konfigurationseditor der Unternehmensbibliothek kann Ihnen dabei helfen. Sie können eine Basiskonfigurationsdatei und anschließend Deltas für jede Umgebung erstellen. Anschließend können Sie die Basiskonfiguration und das Delta zusammenführen, um eine umgebungsspezifische web.config zu erstellen. Schauen Sie sich die Informationen hier an, die Sie besser durch die Informationen führen als ich.

PhilPursglove
quelle
3

Sie können es auch zu einem Post-Build-Schritt machen. Richten Sie eine neue Konfiguration ein, die zusätzlich zu Debug und Release "Bereitstellen" lautet, und kopieren Sie dann den Schritt nach dem Erstellen über die richtige web.config.

Wir verwenden für alle unsere Projekte automatisierte Builds, und mit diesen aktualisiert das Build-Skript die Datei web.config, um auf den richtigen Speicherort zu verweisen. Aber das hilft dir nicht, wenn du alles von VS aus machst.

Cory Foy
quelle
3

Dies ist einer der großen Vorteile der Verwendung der machine.config. Bei meinem letzten Job hatten wir Entwicklungs-, Test- und Produktionsumgebungen. Wir könnten die machine.config für Dinge wie Verbindungszeichenfolgen verwenden (zu der entsprechenden SQL-Maschine dev / test / prod).

Dies ist möglicherweise keine Lösung für Sie, wenn Sie keinen Zugriff auf die eigentliche Produktionsmaschine haben (z. B. wenn Sie ein Hosting-Unternehmen auf einem gemeinsam genutzten Host verwenden).

Timothy Khouri
quelle
1

Sie können auch die Erweiterung "Configuration Transform" verwenden, die genauso funktioniert wie "SlowCheetah".

Parth Kale
quelle
Ja, es funktioniert, aber nur beim Bereitstellen, nicht beim Kompilieren. Ich wünschte, ich könnte einfach mit verschiedenen Konfigurationsumwandlungsumgebungen kompilieren und debuggen
Ch'nycos