Чтение ключа из Web.Config с использованием ConfigurationManager

284

Я пытаюсь прочитать ключи из Web.configфайла в другом слое, чем веб-слой (То же решение)

Вот что я пытаюсь:

string userName = System.Configuration.ConfigurationManager.AppSettings["PFUserName"];
string password = System.Configuration.ConfigurationManager.AppSettings["PFPassWord"];

И вот мой appSettingsв Web.configфайле:

<configuration>
   ....
   <appSettings>
      <add key="PFUserName" value="myusername"/>
      <add key="PFPassWord" value="mypassword"/>
   </appSettings>
   ....
</configuration>

Когда я отлаживаю код usernameи passwordпросто null, чтобы он не получал значения ключей.

Что я делаю не так, чтобы прочитать эти значения?

Туаль
источник
Как к этому второму проекту обращается ваш сайт?
Дэн Аткинсон
13
Ваш синтаксис правильный . Вы, вероятно, отредактировали неправильный файл web.config, поэтому он возвращается NULL. Поздний комментарий, но никто не указал на это.
Хаммад Хан
1
Вот что случилось со мной, я был в представлении web.config.
JQII
1
Только веб-проект имеет доступ к объекту System.Configuration.ConfigurationManager.AppSettings. Другие слои не могут получить доступ к этому объекту, так как они не реализуют System.Web.
Хашим Ахтар

Ответы:

476

Попробуйте вместо этого использовать класс WebConfigurationManager. Например:

string userName = WebConfigurationManager.AppSettings["PFUserName"]
Гектор Корреа
источник
2
Спасибо за ваш ответ, я попробовал, как вы рекомендовали, и все равно получите тот же результат. Я на самом деле теперь получаю исключение NullReferenceException для ToString ()
twal
Если вы получаете нулевое исключение, это означает, что не найден параметр. Попробуйте сделать что-то вроде этого: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" и вы, вероятно, получите нулевое значение, что означает, что он не находит запрошенную настройку.
Гектор Корреа
21
Вы уверены, что настройки находятся на правильном web.config? (Я сделал ошибку, прежде чем сбросить свои значения в web.config в папке «Views» и потерял кучу времени на устранение неполадок, почему они не работают должным образом.
Гектор Корреа
Отлично. Я рад, что это сделал.
Гектор Корреа
4
Спасибо. Вы можете удалить ToString, потому что индексатор AppSettings уже возвращает строку.
Идо Ран
43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];
Йогесваран К
источник
12
Правильный ответ. ToString()избыточно, хотя.
Анар Халилов
9
ToString может быть опасным, если значение не указано в конфигурации приложения. Лучше перехватить возвращаемый объект и проверить его на ноль перед разрешением. Попробуйте запустить его, когда «mysettings» отсутствует в конфигурации, и вы увидите всплывающее исключение. Вместо этого что-то вроде того, что ниже, может быть безопаснее ... string key = "mysettings"; строковое значение = ConfigurationManager.AppSettings [ключ]; if (value == null) value = "неизвестное значение";
Джо Хили
1
true. В .ToString () нет необходимости, поскольку это строка
Rola
2
@JoeHealy Вы можете сократить это и повысить четкость с помощью оператора string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
объединения нулей
Мне интересно, в чем разница между этим ответом и кодом в вопросе ОП! Разве они не одинаковы?
user1451111
6

Если вызывающий объект - другой проект, вы должны написать конфигурацию в вызывающем проекте, а не вызываемом.

сабля
источник
6

Я нашел это решение весьма полезным . Он использует C # 4.0 DynamicObject, чтобы обернуть ConfigurationManager. Так что вместо доступа к значениям, как это:

 WebConfigurationManager.AppSettings["PFUserName"]

Вы получаете доступ к ним как к собственности:

dynamic appSettings = new AppSettingsWrapper();
Console.WriteLine(appSettings.PFUserName);  

РЕДАКТИРОВАТЬ : Добавление фрагмента кода в случае, если ссылка становится устаревшей:

public class AppSettingsWrapper : DynamicObject
{
     private NameValueCollection _items;

    public AppSettingsWrapper()
    {
        _items = ConfigurationManager.AppSettings;
    }

     public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = _items[binder.Name];
        return result != null;
    }
}
mateuscb
источник
2

Полный путь для этого

System.Configuration.ConfigurationManager.AppSettings["KeyName"]
Сиддхартха
источник
2

Там будет два файла Web.config. Я думаю, что вы, возможно, перепутали эти два файла.

Проверьте это изображение:

нажмите на эту ссылку и проверьте это изображение

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

Надеюсь, это поможет вам

Раджа Гангадхар
источник
1

Эта проблема возникает, если этот проект используется другим проектом. Убедитесь, что вы скопировали ключи настройки приложения в app.config или web.config родительского проекта.

Картикеян Мутху
источник
1

Также вы можете попробовать эту строку, чтобы получить строковое значение из app.configфайла.

var strName= ConfigurationManager.AppSettings["stringName"];
Ram Beer Singh
источник
0

с допущением ниже настройки в файле .config:

<configuration>
   <appSettings>
     <add key="PFUserName" value="myusername"/>
     <add key="PFPassWord" value="mypassword"/>
   </appSettings> 
</configuration>

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

public class myController : Controller
{
    NameValueCollection myKeys = ConfigurationManager.AppSettings;

    public void MyMethod()
    {
        var myUsername = myKeys["PFUserName"];
        var myPassword = myKeys["PFPassWord"];
    }
}
Айюб Амини
источник
-5

Извините, я не проверял это, но я думаю, что это сделано так:

var filemap = new System.Configuration.ExeConfigurationFileMap();            
System.Configuration.Configuration config =  System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(filemap, System.Configuration.ConfigurationUserLevel.None);

//usage: config.AppSettings["xxx"]
Ли Смит
источник