Конфигурационные файлы .NET configSource вне папки каталога приложения

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

  

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

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

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

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

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

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

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

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

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

 Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path) 

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

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

Visual Studio 2015

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

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

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

  

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

    

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

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

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

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

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

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

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

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

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

  

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

      

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

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

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

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

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

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

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

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

     

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

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

    
  • Является ли утечка памяти, если MemoryStream в .NET не закрыт?
  • Разрешение MSB3247 - обнаружены конфликты между различными версиями одной и той же зависимой сборки
  • Как выполнять команды на сервере SSH в C #?
  • Коллекция была изменена; перечисление не может выполнить ошибку при удалении ListItem из LIstBox
  • Как я читаю диск напрямую с .Net?
  • Виртуальная машина Java и CLR
  • Как создать элемент управления браузером браузера Explorer?
  • Как указать атрибуты данных в бритве, например, data-externalid = "23151" на @ this.Html.CheckBoxFor (...)
  • безопасно ли поддерживать подключение к базам данных в течение длительного времени
  • Asp.Net MVC3: установка пользовательского IServiceProvider в ValidationContext, поэтому валидаторы могут разрешать услуги
  • LINQ - Синтаксис запроса против цепей методов и lambda
  • Давайте будем гением компьютера.