Использование внешнего файла .config в configSource приводит к ошибке

#c# #.net #app-config

#c# #.net #app-config

Вопрос:

Я поиграл с тем, как использовать Configuration Manager для чтения / записи пользовательских разделов в файле App.config для приложения WPF на C #. Я прочитал эту превосходную статью о демистифицированной конфигурации .NET 2.0, и это очень помогло мне в использовании конфигурационных файлов. Вот исходный файл App.config, который я написал, и он отлично работает.

App.config

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="example" type="CustomConfig.ExampleSection, CustomConfig" />
  </configSections>
  <example version="A sample string value." />
  <appSettings>
    <add key="version_string" value="1.01" />
  </appSettings>
</configuration>
  

Но когда я изменил файл App.config таким образом, что мой пользовательский раздел будет считываться из внешнего файла конфигурации, упомянутого в configSource, Visual Studio выдает мне ошибку

Формат файла configSource должен быть элементом, содержащим название раздела.

Вот файлы App.config и example.config

Изменен App.config

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="example" type="CustomConfig.ExampleSection, CustomConfig" />
  </configSections>
  <example configSource="example.config" />
  <appSettings>
    <add key="version_string" value="1.01" />
  </appSettings>
</configuration>
  

example.config

 <?xml version="1.0"?>
<example>
    <add key="version" value="blahblah" />
</example>
  

Комментарии:

1. Если вы публикуете образцы кода, XML или данных, пожалуйста , выделите эти строки в текстовом редакторе и нажмите на кнопку «образцы кода» ( { } ) на панели инструментов редактора, чтобы красиво оформить и выделить синтаксис! При публикации сообщений об ошибках, пожалуйста , используйте кавычки ( ` » ` ) для правильного форматирования сообщения об ошибке.

2. Спасибо, я буду иметь это в виду в следующий раз

3. Кажется, что вы поместили свой configSource= в <example> тег, но на самом деле вы внедрили содержимое своего <appSettings> тега…….

Ответ №1:

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

если вам нужно сохранить некоторые ключи, связанные с проектом, в web.config и ваш персональный ключ в другом файле (рекомендуется по соображениям безопасности), используйте file свойство вместо configSource .

файл web.config:

 <configuration>
  <appSettings file="../AppSettings.config">
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
  </appSettings>
</configuration>
  

Файл AppSettings.config:

 <?xml version="1.0"?>

<appSettings>
  <add key="RutaBodega" value="D:TestCard"/>
  <add key="CodeLen" value="5"/>
</appSettings>
  

Надеюсь, это поможет другим!

Ответ №2:

У редактора Visual Studio / intellisense есть недостаток в том, что он жалуется на configSource= атрибут — но это абсолютно законно, и это действительно работает; Я использую его каждый день в различных производственных системах.

Моя рекомендация: просто попробуйте! 🙂 Запустите код — я почти уверен, что он сработает (ваши конфигурации выглядят нормально для меня).

Обновление: хорошо — похоже, вы полностью меняете стиль <example> тега. В вашем оригинале app.config у вас есть:

 <example version="A sample string value." />
  

Поэтому, конечно, ваш externalized example.config должен содержать те же значения и ту же структуру:

 <?xml version="1.0"?>
<example version="A sample string value." />
  

Можете ли вы попробовать с этим example.config ??

Комментарии:

1. marc Я действительно запустил код, и он выдавал мне это исключение. Вот изображение ошибки imageshack.us/photo/my-images/840/errorgz.jpg . На самом деле я провел множество поисковых запросов в Интернете и обнаружил, что я все делал правильно, но он просто не запускался

2. @chaitanya: когда вы помещаете свой узел <example> во внешний конфигурационный файл, вы не можете полностью изменить свою структуру!! Вам нужно иметь точно такую же структуру, которая была у вас раньше в вашем первом app.config — смотрите Мое обновление….

3. Отлично. Спасибо, Марк, это работает. Что было не так со структурой ключей и значений. Соответствует ли тег add всякий раз, когда у вас есть тег, вложенный внутри тега example

4. Вы используете <add key="..." value="..." /> , когда раздел конфигурации, с которым вы имеете дело, имеет такую структуру — например, <appSettings> . Это не имеет ничего общего с помещением вашей конфигурации во внешний файл..

Ответ №3:

Моя проблема в том, что я добавлял configSource И ключ в один и тот же тег.

Неверный:

 <appSettings configSource="Appsettings.config">
    <add key="Setting1" value="May 5, 2014"/>
</appSettings>
  

Если вы удалите тег «добавить» или переместите его в свой файл configSource, ошибка исчезнет.

Исправить:

 <appSettings configSource="Appsettings.config" />
  

Ответ №4:

Если раздел, который вы делаете внешним, определен в configSections, вам следует поместить атрибут configSource в элемент, определяющий раздел. Только разделы AppSettings и ConnectionStrings (которым не нужны определения в configSections) должны иметь теги с configSource в теле основного конфигурационного файла.

Комментарии:

1. Кит, у меня просто есть теги для AppSettings, если вы посмотрите в измененный файл App.config, и я думаю, что я поместил атрибут configSource в элемент «example»

2. Неверно — любой раздел конфигурации может быть экстернализирован с помощью configSource= атрибута — даже если VS жалуется на это….

3. Частично помогло. Поскольку только внешний пользовательский раздел выдает ошибку. Мне пришлось определить с <section name="CustomConfigSection" type="Teknikprogramlama.Configuration.Manager.Examples.Sections.CustomConfigSection, Teknikprogramlama.Configuration.Manager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />