Pliki konfiguracyjne. NET configSource poza katalogiem aplikacji

Mam dwie aplikacje jedna aplikacja konsolowa a druga ASP.NET app. Obaj muszą znać te same appSettings i connectionStrings. Więc idealnie chciałbym użyć właściwości configSource aplikacji.config / web.pliki konfiguracyjne wskazujące na centralną lokalizację. Na przykład

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

To jednak zawodzi z błędem:

Atrybut configSource jest nieprawidłowy.: ConfigSource "D:\appSettings.config ' jest nieprawidłowy. Musi odnosić się do pliku w tym samym katalog lub w podkatalogu jako plik konfiguracyjny.

Czy i tak nadal można używać menedżerów konfiguracji appSettings/connectionStrings i pobierać wartości z zewnętrznej lokalizacji?
Jestem zadowolony z konieczności dodawania kodu, aby to zrobić, ale nie chcę musieć zastępować całego systemu configuration manager.

Author: Robert MacLean, 2009-02-20

10 answers

Innym rozwiązaniem jest po prostu dodanie pliku konfiguracyjnego we wszystkich projektach jako łącza zamiast kopiowania pliku do projektów. Następnie Ustaw "Build Action" pliku Na "Content" I "Copy to Output Directory" na "Copy if newer", a podczas kompilacji projektu będziesz miał plik w katalogu wyjściowym.

Aby dodać plik jako łącze w oknie dialogowym "Dodaj istniejący element", znajduje się przycisk Dodaj z rozwijanym menu. Wybierz "Dodaj jako link" z rozwijanego menu na Dodaj przycisk, aby zakończyć proces.

 92
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 23:06:19

W appSettings możesz użyć file= zamiast configSource=

 30
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-02 17:01:06

Wygląda na to, że tak właśnie jest. configSource musi znajdować się w tym samym folderze lub głębiej.

Ty mógłbyś , chociaż nie jestem pewien, czy powinieneś, użyć twardego łącza NTFS. [szalony uśmiech]

 16
Author: Iain M Norman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-20 11:03:33

Możesz załadować konfigurację z dowolnego miejsca, ale nie będzie ona dostępna poprzez statyczne właściwości ConfigurationManager:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(istnieje przeciążenie, które pozwala określić wiele plików, aby obsługiwać domyślną hierarchię / użytkownik-roaming/użytkownik-lokalny.)

Utrata właściwości statycznych oznacza, że cały kod musi być świadomy różnych konfiguracji.

 8
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-20 11:01:43

Visual Studio 2015

Jeśli masz ten problem z Web.Config zaakceptowana odpowiedź jest poprawna, ale tylko do rozszerzenia, ponieważ to sprawiło, że dałem sobie twarz-palm:

Kiedy dodasz .plik konfiguracyjny do twojego projektu za pomocą "Dodaj jako Link", a następnie ustaw właściwość kopiowania linku na "Kopiuj jeśli Nowsze" lub "Kopiuj zawsze", a następnie fizyczny plik zostanie skopiowany do folderu / bin.

Tak więc, gdy masz zdefiniowaną sekcję config w Web.Config like to:

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

Następnie musisz zdefiniować powiązany element konfiguracyjny w następujący sposób:

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

Taki, że configSource wskazuje na fizyczny bin\MySpecialConfig.plik konfiguracyjny nie do dowiązania zauważ również, że ścieżka jest względną ścieżką fizyczną.

To może wydawać się absurdalnie oczywiste, ale jeśli nie zrobiłeś tego wcześniej, plik fizyczny nie znajduje się jeszcze w folderze \ bin, więc może nie kliknąć od razu.

 5
Author: Serexx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-16 07:30:57

Możesz umieścić oba ustawienia w maszynie .config i wtedy są one dostępne dla wszystkich aplikacji na serwerze.

 3
Author: freggel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-20 11:01:39

Najlepszym rozwiązaniem okazało się umieszczenie "udostępnionych" plików konfiguracyjnych w centralnych plikach, a następnie użycie zdarzenia pre-build w Visual Studio, aby skopiować je do względnego folderu każdego projektu, który tego potrzebował.

 2
Author: Robert MacLean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-11 11:02:14

Miałem spory problem z tym problemem, ale znalazłem dobre rozwiązanie tutaj: test run with external config

(możesz skierować test run do skopiowania plików i katalogów do katalogu test run poprzez edycję .plik testrunconfig.)

Chociaż dlaczego projekt typu test jednostkowy może uzyskać ustawienia konfiguracyjne z własnej aplikacji.config, ale nie być w stanie załadować odwołanych plików konfiguracyjnych jak normalna aplikacja.config jest dla mnie trochę zaskakujący. Nazwałbym to pluskwą, bo ty spodziewałbym się aplikacji projektu testowego.config zachowuje się tak samo jak aplikacja.config zachowuje się, ale tak nie jest.

 2
Author: marcel_g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:30

W przypadku łańcuchów połączeń, rzeczywiście możliwe jest wskazanie udostępnionego pliku. Jeśli udostępniony plik znajduje się w sieci UNC, wymaga uprawnień administracyjnych na komputerze, na którym aplikacja będzie hostowana.

Rozwiązanie: w sieci.config, użyj configSource, aby wskazać lokalny plik konfiguracyjny. Ze względu na ograniczenia. Net, musi to być na poziomie lub poniżej poziomu głównego pliku konfiguracyjnego. Po prostu wskażę plik w samym folderze aplikacji:

<connectionStrings configSource="ConnectionStrings.config" />

We współdzielonej lokalizacji, która jest Dostępny dla użytkownika puli aplikacji, Dodaj plik konfiguracyjny zawierający współdzielone ciągi połączeń. Ten plik nie może zawierać żadnego xml poza sekcją connectionStrings. Udostępniony plik, ConnectionStrings.config, wygląda tak:

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>  
Teraz sztuczka. Utwórz w folderze aplikacji dowiązanie symboliczne systemu Windows wskazujące na zewnętrzny, współdzielony plik konfiguracyjny. Będziesz potrzebował uprawnień administratora, aby to zrobić:
mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config

Właśnie przechytrzyliśmy .Net. System konfiguracji będzie użyj ustawienia configSource, aby znaleźć łańcuchy połączeń w lokalnym pliku o nazwie ConnectionStrings.config. Dowiązanie symboliczne wygląda jak plik do. Net, a dowiązanie symboliczne rozwiązuje się do udostępnionego pliku konfiguracyjnego.

Zastrzeżenia: zmiany w udostępnionym pliku nie powodują automatycznego restartu aplikacji w .Net. w przypadku usług IIS, strona internetowa lub pula aplikacji będzie musiała zostać ponownie uruchomiona ręcznie.

Ze względu na potrzebę uprawnień administracyjnych do tworzenia dowiązania symbolicznego, takie podejście może nie działać na wszystkich. Istnieją dwie powiązane alternatywy, które mogą działać, jeśli udostępniony plik znajduje się na tym samym dysku logicznym - łącza twarde i łącza. Zobacz ta dyskusja i ta dyskusja Aby uzyskać więcej informacji.

 2
Author: Scott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 13:14:45

Możesz użyć atrybutu file zamiast configSource

Jest dobry artykuł tutaj o nim

To pozwala określić ścieżkę względną w taki sposób

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings file="..\..\..\..\..\..\ExternalFile.config"></appSettings>
</configuration>

Ścieżka jest względem katalogu wyjściowego.

Następnie w pliku zewnętrznym.config wystarczy dodać appSettings sekcję

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>
 1
Author: alexs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-01 19:18:34