Почему значение app.config равно нулю?

#asp.net #configuration

#asp.net #конфигурация

Вопрос:

У меня есть трехуровневое веб-приложение, которое создает три отдельные библиотеки DLL:

  • Web.UI.dll
  • Web.Application.dll
  • Web.DAL.dll

Оба Web.Application.dll и Web.DAL.dll имеют свои собственные app.configs. Мне нужно получить доступ к определенному параметру, который находится в web.config. Я использую следующий код:

 [CacheUtil.cs]
string cacheName = ConfigurationManager.AppSettings.Get("CacheName");
  

Я проверил, что этот параметр существует. Итак, почему тогда, когда я запускаю, я получаю NULL? Должно ли CacheName существовать во всех файлах .config?

Вот настройка в web.config:

   <appSettings>
    <add key="CacheName" value="staging"/>
  

К вашему сведению, CacheUtil — это синглтон, который лениво инициализируется при первом доступе. Первый доступ происходит в DAL.dll проект.

Спасибо!

Ответ №1:

Выполняется только web.config чтение. Другие файлы конфигурации ( Web.Application.dll.config и Web.DAL.config ) не читаются.

Конфигурация не привязана к библиотекам; только к конечному исполняемому файлу, который выполняется ( AppName.exe.config или web.config )

Проекты в Visual Studio, которые создают EXE-файл, могут иметь app.config файл, и этот файл обрабатывается специально при сборке; Он переименовывается ProgramName.exe.config и копируется в выходной каталог. app.config в проектах библиотеки классов или веб-приложений это не будет иметь никакого эффекта.

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

1. Хм, любопытно. Кажется, что он нормально читается в режиме отладки, но не после публикации. Итак, app.config бессмысленны?

2. app.config предназначен для проектов, которые создают EXE. Частью процесса сборки является то, что он переименовывается ProgramName.exe.config и копируется в выходной каталог. Веб-приложения разные — вместо того, чтобы искать ProgramName.exe.config , они ищут web.config . Наличие app.config файлов в проекте библиотеки классов бессмысленно без копирования содержащихся в нем значений в соответствующий конфигурационный файл.

Ответ №2:

Попробуйте это:

 cachename = ConfigurationManager.AppSettings["CacheName"];
  

Это при условии, что вы пытаетесь прочитать AppSettings из файла app.config проекта. Вы не можете прочитать конфигурацию из другого проекта, если не используете какую-либо другую логику, но это не будет через класс ConfigurationManager . Это должен быть обычный ввод-вывод.