Ich habe zwei Anwendungen, eine Konsolenanwendung und eine ASP.NET-Anwendung. Beide müssen dieselben AppSettings und ConnectionStrings kennen. Idealerweise möchte ich die configSource-Eigenschaft von app.config / web.config-Dateien verwenden, um dies auf einen zentralen Speicherort 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 überhaupt noch die Konfigurationsmanager appSettings / connectionStrings zu verwenden und die Werte von einem externen Speicherort abzurufen?
Ich bin froh, dass ich dafür Code hinzufügen muss, aber ich möchte nicht das gesamte Konfigurationsmanagersystem ersetzen müssen.
quelle
configSource
und alles scheint in Ordnung zu sein . Danke noch einmal!Unter appSettings können Sie file = anstelle von configSource = verwenden
quelle
Es scheint so zu sein. configSource muss sich im selben Ordner oder tiefer befinden.
Sie können , obwohl ich nicht sicher bin, ob Sie dies tun sollten , einen NTFS-Hardlink verwenden. [verrücktes Grinsen]
quelle
Visual Studio 2015
Wenn Sie dieses Problem mit Web.Config haben, ist die akzeptierte Antwort korrekt, aber nur zur Erweiterung, da ich mir die Gesichtspalme gegeben habe:
Wenn Sie Ihrem Projekt mit 'Als Link hinzufügen' eine .config-Datei hinzufügen und dann die Copy-Eigenschaft des Links auf 'Copy If Newer' oder 'Copy Always' setzen, wird die physische Datei in den Ordner / bin kopiert.
Wenn Sie also einen Konfigurationsabschnitt wie folgt in Web.Config definiert haben:
dann müssen Sie das zugehörige Konfigurationselement wie folgt definieren:
So dass die configSource auf die physische Datei bin \ MySpecialConfig.config verweist und nicht auf den Link . Beachten Sie außerdem, dass der Pfad ein relativer physischer Pfad ist.
Das mag lächerlich offensichtlich erscheinen, aber wenn Sie dies noch nicht getan haben, befindet sich die physische Datei noch nicht im Ordner \ bin, sodass sie möglicherweise nicht sofort klickt.
quelle
Sie können Konfiguration von einem beliebigen Ort laden, aber es wird nicht über die statischen Eigenschaften von Konfigurationsmanager zur Verfügung stehen:
(Es gibt eine Überlastung, mit der mehrere Dateien angegeben werden können, um die Standardhierarchie / Benutzerroaming / Benutzerlokale Hierarchie zu unterstützen.)
Der Verlust der statischen Eigenschaften bedeutet, dass der gesamte Code die unterschiedliche Konfiguration kennen muss.
quelle
Bei Verbindungszeichenfolgen ist es tatsächlich möglich, auf eine gemeinsam genutzte Datei zu verweisen. Wenn sich die freigegebene Datei in einem Netzwerk-UNC befindet, sind Administratorrechte auf dem Computer erforderlich, auf dem die App gehostet wird.
Lösung: Verwenden Sie in Ihrer web.config configSource, um auf eine lokale Konfigurationsdatei zu verweisen. Aufgrund von .Net-Einschränkungen muss dies auf oder unter der Ebene der Root-Konfigurationsdatei liegen. Ich zeige nur auf eine Datei im App-Ordner selbst:
Fügen Sie an einem freigegebenen Speicherort, auf den der Benutzer des Anwendungspools zugreifen kann, die Konfigurationsdatei mit freigegebenen Verbindungszeichenfolgen hinzu. Diese Datei darf keine andere XML-Datei als den Abschnitt connectionStrings selbst enthalten. Die freigegebene Datei ConnectionStrings.config sieht folgendermaßen aus:
Nun der Trick. Erstellen Sie in Ihrem App-Ordner einen symbolischen Windows-Link, der auf die externe, freigegebene Konfigurationsdatei verweist. Dazu benötigen Sie Administratorrechte:
Wir haben gerade .Net überlistet. Das Konfigurationssystem verwendet die Einstellung configSource, um Verbindungszeichenfolgen in einer lokalen Datei mit dem Namen ConnectionStrings.config zu finden. Die symbolische Verknüpfung sieht für .Net wie eine Datei aus, und die symbolische Verknüpfung wird in die freigegebene Konfigurationsdatei aufgelöst.
Vorsichtsmaßnahmen: Änderungen an der freigegebenen Datei lösen nicht automatisch einen Neustart der App in .Net aus. Bei IIS muss die Website oder der App-Pool manuell neu gestartet werden.
Aufgrund der Notwendigkeit von Administratorrechten zum Erstellen der symbolischen Verknüpfung funktioniert dieser Ansatz möglicherweise nicht für alle. Es gibt zwei verwandte Alternativen, die möglicherweise funktionieren, wenn sich die freigegebene Datei auf demselben logischen Laufwerk befindet - Hardlinks und Junctions. Weitere Informationen finden Sie in dieser Diskussion und in dieser Diskussion .
quelle
Sie können beide Einstellungen in die machine.config einfügen und sie sind dann für alle Ihre Anwendungen auf dem Server verfügbar.
quelle
Die Lösung, die ich am besten fand, bestand darin, die "freigegebenen" Konfigurationsdateien in zentralen Dateien abzulegen und sie dann mithilfe eines Pre-Build-Ereignisses in Visual Studio in einen relativen Ordner jedes Projekts zu kopieren, das sie benötigte.
quelle
Ich hatte einige Probleme mit diesem Problem, aber ich habe hier eine gute Lösung dafür gefunden: Testlauf mit externer Konfiguration
(Sie können den Testlauf anweisen, Dateien und Verzeichnisse in das Testlaufverzeichnis zu kopieren, indem Sie die Datei .testrunconfig bearbeiten.)
Obwohl es für mich verwirrend ist, warum das Unit-Test-Projekt Konfigurationseinstellungen von seiner eigenen app.config abrufen kann, aber nicht in der Lage ist, referenzierte Konfigurationsdateien wie eine normale app.config zu laden. Ich würde es als Fehler bezeichnen, da Sie erwarten würden, dass sich ein Testprojekt app.config genauso verhält wie die app.config der Anwendung, dies jedoch nicht.
quelle
Sie können das
file
Attribut anstelle von verwendenconfigSource
Es gibt einen guten Artikel hier drauf
Auf diese Weise können Sie einen relativen Pfad wie diesen angeben
Der Pfad ist relativ zum Ausgabeverzeichnis.
Dann fügen Sie in ExternalFile.config einfach den
appSettings
Abschnitt hinzuquelle