Читання ключа з 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
Ось що трапилося зі мною, я був у веб-переглядачі Views.
JQII

1
Тільки веб-проект має доступ до об'єкта System.Configuration.ConfigurationManager.AppSettings. Інші шари не можуть отримати доступ до цього об'єкта, оскільки вони не реалізують System.Web.
Хашим Ахтар

Відповіді:


475

Спробуйте використовувати натомість клас WebConfigurationManager. Наприклад:

string userName = WebConfigurationManager.AppSettings["PFUserName"]

2
Дякую за вашу відповідь, я намагався, як ви рекомендували, і все одно отримую той же результат. Насправді я отримую NullReferenceException на ToString ()
укріплення

Якщо ви отримаєте нульовий виняток, це означає, що це не пошук налаштування. Спробуйте зробити щось подібне: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" і, ймовірно, ви отримаєте нульове значення, що означає, що він не знаходить потрібний параметр.
Гектор Коррея

21
Ви впевнені, що налаштування налаштовані на правильний web.config? (Я помилився перед тим, як скидати свої значення в web.config у папці "Перегляди" і втратив масу часу на усунення несправностей, чому це не працює, як очікувалося.
Гектор Корреа

Чудово. Я радий, що це було.
Гектор Коррея

4
Дякую, Ви можете кинути ToString, тому що індексник AppSettings вже повертає рядок.
Ідо Ран

43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];

12
Правильна відповідь. ToString()але це зайве.
анар халілов

9
ToString може бути небезпечним, якщо значення не знаходиться в конфігурації програми. Краще зафіксувати повернутий об'єкт і перевірити його на нуль, перш ніж вирішити. Спробуйте запустити його, коли "mysettings" немає в конфігурації, і ви побачите поп винятків. Натомість щось на зразок того, що нижче може бути безпечнішим ... string key = "mysettings"; значення рядка = ConfigurationManager.AppSettings [ключ]; if (value == null) value = "невідоме значення";
Джо Хілі

1
правда, немає необхідності в .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;
    }
}


2

Будуть два файли Web.config. Я думаю, ви, можливо, переплутали ці два файли.

Перевірте це зображення:

натисніть на це посилання та перевірте це зображення

На цьому зображенні ви можете побачити два файли Web.config. Ви повинні додати свої константи до тієї, яка знаходиться в папці проекту, а не в папці перегляду

Сподіваюся, це може вам допомогти


1

Ця проблема виникає, якщо цей проект використовується іншим проектом. Обов’язково скопіюйте ключі налаштування програми на додаток батьківського проекту app.config або web.config.


1

Також ви можете спробувати цей рядок, щоб отримати значення рядка з app.configфайлу.

var strName= ConfigurationManager.AppSettings["stringName"];

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"]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.