Файлы конфигурации .NET configSource вне папки каталога приложения - PullRequest
78 голосов
/ 20 февраля 2009

У меня есть два приложения: одно - консольное, а другое - приложение ASP.NET. Им обоим нужно знать одинаковые appSettings и connectionStrings. Поэтому в идеале я хотел бы использовать свойство configSource файлов app.config / web.config, чтобы указать это на центральное расположение. Например

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

Это, однако, не с ошибкой:

Недопустимый атрибут configSource .: Недопустимый configSource 'D: \ appSettings.config'. Он должен ссылаться на файл в том же каталоге или в подкаталоге, что и файл конфигурации.

Есть ли еще способ использовать диспетчеры конфигурации appSettings / connectionStrings и получать значения из внешнего местоположения?
Я счастлив, что мне нужно добавить код, но я не хочу заменять всю систему диспетчера конфигурации.

Ответы [ 10 ]

97 голосов
/ 29 марта 2009

Другое решение - просто добавить файл конфигурации во все ваши проекты в виде ссылки, вместо того, чтобы фактически копировать файл в ваши проекты. Затем установите «Действие сборки» файла в «Содержимое» и «Копировать в выходной каталог» в «Копировать, если новее», и при компиляции проекта файл будет находиться в выходном каталоге.

Чтобы добавить файл в качестве ссылки в диалоговом окне «Добавить существующий элемент», есть кнопка «Добавить» с раскрывающимся списком. Выберите «Добавить как ссылку» в раскрывающемся списке кнопки «Добавить», чтобы завершить процесс.

33 голосов
/ 02 декабря 2009

В appSettings вы можете использовать file = вместо configSource =

16 голосов
/ 20 февраля 2009

Кажется, что так оно и есть. configSource должен находиться в той же папке или глубже.

Вы могли бы , хотя я не уверен, что вы должны , использовать жесткую ссылку NTFS. [безумная улыбка]

8 голосов
/ 20 февраля 2009

Вы можете загрузить конфигурацию из произвольного местоположения, , но она не будет доступна через статические свойства ConfigurationManager:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(Существует перегрузка, позволяющая указывать несколько файлов для поддержки иерархии по умолчанию / user-roaming / user-local.)

Потеря статических свойств означает, что весь код должен знать о другой конфигурации.

7 голосов
/ 16 июля 2016

Visual Studio 2015

Если у вас возникла эта проблема с Web.Config, принятый ответ правильный, но только для расширения, потому что это заставило меня дать себя лицом к лицу:

Когда вы добавляете файл .config в свой проект с помощью «Добавить как ссылку», а затем устанавливаете для свойства ссылки «Копировать, если новее» или «Копировать всегда», то физический файл будет скопирован в папку / bin ,

Таким образом, если в Web.Config определен раздел конфигурации, подобный следующему:

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

тогда вы должны определить связанный элемент конфигурации следующим образом:

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

такой, что configSource указывает на физический файл bin \ MySpecialConfig.config , а не на ссылку Также обратите внимание, что путь является относительным физическим путем.

Это может показаться до смешного очевидным, но если вы не сделали этого до того, как физический файл еще не находится в папке \ bin, он может не щелкнуть сразу.

4 голосов
/ 29 августа 2016

В случае строк подключения действительно возможно указать на общий файл. Если общий файл находится в сети UNC, он требует прав администратора на компьютере, на котором будет размещено приложение.

Решение. В файле web.config используйте configSource для указания на локальный файл конфигурации. Из-за ограничений .Net это должно быть на уровне или ниже уровня корневого файла конфигурации. Я просто указываю на файл в самой папке приложения:

<connectionStrings configSource="ConnectionStrings.config" />

В общедоступном месте, которое доступно пользователю пула приложений, добавьте файл конфигурации, содержащий строки общего подключения. Этот файл не должен содержать никаких XML, кроме самого раздела connectionStrings. Общий файл ConnectionStrings.config выглядит следующим образом:

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>  

Теперь уловка. Создайте символическую ссылку Windows в папке приложения, указывающую на внешний общий файл конфигурации. Для этого вам потребуются права администратора:

mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config

Мы только что перехитрили .Net. Система конфигурации будет использовать настройку configSource для поиска строк подключения в локальном файле ConnectionStrings.config. Символическая ссылка выглядит как файл для .Net, а символическая ссылка преобразуется в общий файл конфигурации.

Предупреждения: изменения в общем файле не вызывают автоматического перезапуска приложения в .Net. В случае IIS веб-сайт или пул приложений необходимо будет перезапустить вручную.

Из-за необходимости административных привилегий для создания символической ссылки этот подход может работать не для всех. Есть две связанные альтернативы, которые могут работать, если общий файл находится на одном логическом диске - жесткие ссылки и соединения. См. это обсуждение и это обсуждение для получения дополнительной информации.

3 голосов
/ 20 февраля 2009

Вы можете поместить обе настройки в machine.config , и тогда они будут доступны для всех ваших приложений на сервере.

2 голосов
/ 27 июля 2010

У меня была довольно серьезная проблема с этой проблемой, но я нашел здесь хорошее решение: тестовый запуск с внешней конфигурацией

(Вы можете направить тестовый прогон для копирования файлов и каталогов в каталог тестового прогона, отредактировав файл .testrunconfig.)

Несмотря на то, что проект типа модульного теста может получить настройки конфигурации из своего собственного app.config, но не может загружать ссылочные файлы конфигурации, как обычный app.config, это немного сбивает с толку. Я бы назвал это ошибкой, потому что вы ожидаете, что тестовый проект app.config будет вести себя так же, как и app.config приложения, но это не так.

2 голосов
/ 11 марта 2009

Лучшим решением, которое я нашел, было поместить «общие» файлы конфигурации в центральные файлы и затем использовать событие предварительной сборки в Visual Studio, чтобы скопировать их в относительную папку каждого проекта, который в этом нуждался.

1 голос
/ 01 августа 2018

Вы можете использовать атрибут file вместо configSource

Здесь есть хорошая статья

Это позволяет вам указать относительный путь, например, так:

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

Путь относительно выходного каталога.

Затем в ExternalFile.config вы просто добавляете appSettings раздел

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...