У меня есть два приложения: одно - консольное, а другое - приложение 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 и получать значения из внешнего местоположения?
Я доволен тем, что для этого нужно добавить код, но я не хочу заменять всю систему диспетчера конфигурации.
источник
configSource
и все выглядит хорошо. Еще раз спасибо!В appSettings вы можете использовать file = вместо configSource =
источник
Похоже, так оно и есть. configSource должен находиться в той же папке или глубже.
Вы могли бы , хотя я не уверен, что вам следует использовать жесткую ссылку NTFS. [безумная ухмылка]
источник
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, он может не щелкнуть сразу.
источник
Вы можете загрузить конфигурацию из произвольного места, но она не будет доступна через статические свойства ConfigurationManager:
Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)
(Существует перегрузка, которая позволяет указывать несколько файлов для поддержки иерархии по умолчанию / пользовательский роуминг / локальный пользователь.)
Потеря статических свойств означает, что весь код должен учитывать различную конфигурацию.
источник
В случае строк подключения действительно можно указать на общий файл. Если общий файл находится в сети 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 веб-сайт или пул приложений необходимо будет перезапустить вручную.
Из-за необходимости административных привилегий для создания символической ссылки этот подход может работать не для всех. Есть две связанные альтернативы, которые могут работать, если общий файл находится на одном логическом диске: жесткие ссылки и переходы. См. Это обсуждение и это обсуждение для получения дополнительной информации.
источник
Вы можете поместить оба параметра в файл machine.config, и тогда они будут доступны для всех ваших приложений на сервере.
источник
Решение, которое я нашел наиболее эффективным, заключалось в том, чтобы поместить «общие» файлы конфигурации в центральные файлы, а затем использовать событие предварительной сборки в Visual Studio, чтобы скопировать их в относительную папку каждого проекта, который в этом нуждался.
источник
У меня была серьезная борьба с этой проблемой, но я нашел здесь хорошее решение: тестовый запуск с внешней конфигурацией
(Вы можете направить тестовый запуск для копирования файлов и каталогов в каталог тестового запуска, отредактировав файл .testrunconfig.)
Хотя то, почему проект типа модульного теста может получать параметры конфигурации из своего собственного app.config, но не иметь возможности загружать указанные файлы конфигурации, как обычный app.config, меня немного сбивает с толку. Я бы назвал это ошибкой, потому что вы ожидаете, что тестовый проект app.config будет вести себя так же, как ведет себя app.config приложения, но это не так.
источник
Вы можете использовать
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>
источник