Frage .NET Config Dateien ConfigSource außerhalb des Anwendungsverzeichnisses


Ich habe zwei Anwendungen, eine eine Konsolenanwendung und die andere eine ASP.NET-App. Sie müssen beide die gleichen appSettings und connectionStrings kennen. Im Idealfall möchte ich die configSource-Eigenschaft von app.config / web.config-Dateien verwenden, um das auf einen zentralen Ort zu verweisen. Beispielsweise

<connectionStrings configSource="D:\connectionStrings.config"/>
<appSettings configSource="D:\appSettings.config"/>

Das scheitert jedoch mit einem Fehler:

Das configSource-Attribut ist ungültig .: Die configSource 'D: \ appSettings.config' ist ungültig. Es muss sich auf eine Datei im selben Verzeichnis oder in einem Unterverzeichnis wie die Konfigurationsdatei beziehen.

Gibt es trotzdem noch den Konfigurationsmanager appSettings / connectionStrings und holt die Werte von einem externen Standort?
Ich bin froh, dass ich dazu Code hinzufügen muss, aber ich möchte nicht das gesamte Konfigurationsmanager-System ersetzen müssen.


76
2018-02-20 10:54


Ursprung


Antworten:


Eine andere Lösung besteht darin, die Konfigurationsdatei in allen Projekten als Verknüpfung hinzuzufügen, anstatt die Datei tatsächlich in Ihre Projekte zu kopieren. Setzen Sie dann die "Build Action" der Datei auf "Content" und "Copy to Output Directory" auf "Copy if newer" und wenn Sie das Projekt kompilieren, haben Sie die Datei im Ausgabeverzeichnis.

Um die Datei als Verknüpfung im Dialogfeld "Vorhandenes Objekt hinzufügen" hinzuzufügen, gibt es eine Schaltfläche Hinzufügen mit einem Dropdown-Menü. Wählen Sie "Hinzufügen als Link" aus dem Dropdown auf der Schaltfläche Hinzufügen, um den Vorgang abzuschließen.


91
2018-03-28 22:56



Unter appSettings können Sie file = anstelle von configSource = verwenden


29
2017-12-02 17:01



Es scheint so zu sein. configSource muss sich im selben Ordner oder tiefer befinden.

Sie könnteobwohl ich mir nicht sicher bin sollteVerwenden Sie einen NTFS-Hardlink. [verrücktes Grinsen]


16
2018-02-20 11:03



Sie können die Konfiguration von einem beliebigen Ort laden, aber Es wird nicht über die statischen Eigenschaften von ConfigurationManager verfügbar sein:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(Es gibt eine Überladung, bei der mehrere Dateien angegeben werden können, um die Standard / Benutzer-Roaming / Benutzer-lokale Hierarchie zu unterstützen.)

Das Verlieren der statischen Eigenschaften bedeutet, dass der gesamte Code die unterschiedliche Konfiguration kennen muss.


8
2018-02-20 11:01



Visual Studio 2015

Wenn Sie dieses Problem mit Web.Config haben, ist die angenommene Antwort korrekt, aber nur um zu erweitern, da ich mich damit die Gesichtspalme geben ließ:

Wenn Sie Ihrem Projekt mithilfe von "Als Verknüpfung hinzufügen" eine .config-Datei hinzufügen und dann die Kopiereigenschaft der Verknüpfung auf "Wenn neu kopieren" oder "Immer kopieren" setzen, wird die physische Datei in den Ordner / bin kopiert.

Wenn Sie also einen Konfigurationsabschnitt in Web.Config wie folgt definiert haben:

 <section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" />

dann müssen Sie das zugehörige Konfigurationselement wie folgt definieren:

  <mySpecialConfig configSource="bin\MySpecialConfig.config">
  </mySpecialConfig>

So dass die ConfigSource auf die physische bin \ MySpecialConfig.config-Datei verweist nicht auf den Link  Beachten Sie auch, dass der Pfad a lautet relativ physischer Pfad.

Das mag lächerlich offensichtlich erscheinen, aber wenn Sie dies noch nicht getan haben, befindet sich die physische Datei noch nicht im \ bin-Ordner, sodass sie möglicherweise nicht sofort klickt.


4
2017-07-16 07:25



Sie können beide Einstellungen in die machine.config und dann sind sie für alle Anwendungen auf dem Server verfügbar.


2
2018-02-20 11:01



Die Lösung, die ich am besten fand, war, die "gemeinsamen" Konfigurationsdateien in zentrale Dateien zu schreiben und dann ein Pre-Build-Ereignis in Visual Studio zu verwenden, um sie in einen relativen Ordner jedes Projekts zu kopieren, das sie benötigte.


2
2018-03-11 11:02



Ich hatte mit diesem Thema einen ziemlichen Kampf, aber ich habe hier eine gute Lösung gefunden: Testlauf mit externer Konfiguration 

(Sie können den Testlauf anweisen, Dateien und Verzeichnisse in das Testlaufverzeichnis zu kopieren, indem Sie die .testrunconfig-Datei bearbeiten.)

Obwohl, warum das Unit-Test-Typ-Projekt kann Konfigurationseinstellungen aus seiner eigenen app.config, aber nicht in der Lage, referenzierte Konfigurationsdateien wie eine normale app.config zu laden ist irgendwie verwirrend für mich. Ich würde es einen Fehler nennen, weil Sie erwarten würden, dass sich ein Testprojekt app.config genauso verhält wie die app.config der Anwendung, tut es aber nicht.


2
2017-07-27 12:43