Odczytywanie klucza z Web.Config za pomocą ConfigurationManager

284

Próbuję odczytać klucze z Web.configpliku na innej warstwie niż warstwa internetowa (to samo rozwiązanie)

Oto, czego próbuję:

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

A oto moje appSettingsw Web.configpliku:

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

Kiedy debuguję kod usernamei robię passwordto po prostu null, więc nie otrzymuje wartości kluczy.

Co robię źle, czytając te wartości?

twal
źródło
W jaki sposób dostęp do tego drugiego projektu znajduje się w Twojej witrynie?
Dan Atkinson
13
Twoja składnia jest poprawna . Prawdopodobnie edytowałeś niewłaściwy plik web.config, dlatego on zwraca NULL. Późny komentarz, ale nikt tego nie zauważył.
Hammad Khan
1
Tak się stało, byłem w Widoku web.config.
JQII
1
Tylko projekt WWW ma dostęp do obiektu System.Configuration.ConfigurationManager.AppSettings. Inne warstwy nie mogą uzyskać dostępu do tego obiektu, ponieważ nie implementują System.Web.
Hashim Akhtar

Odpowiedzi:

475

Zamiast tego spróbuj użyć klasy WebConfigurationManager. Na przykład:

string userName = WebConfigurationManager.AppSettings["PFUserName"]
Hector Correa
źródło
2
Dzięki za odpowiedź, próbowałem zgodnie z zaleceniami i nadal otrzymuję ten sam wynik. Obecnie otrzymuję
wyjątek
Jeśli otrzymasz wyjątek zerowy, oznacza to, że nie można znaleźć ustawienia. Spróbuj zrobić coś takiego: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" i prawdopodobnie otrzymasz wartość zerową, co oznacza, że ​​nie znajduje żądanego ustawienia.
Hector Correa
21
Czy na pewno ustawienia są poprawne w pliku web.config? (Popełniłem błąd przed zrzuceniem moich wartości do pliku web.config w folderze „Widoki” i straciłem mnóstwo czasu na rozwiązywanie problemów, dlaczego nie działa zgodnie z oczekiwaniami.
Hector Correa
Wspaniały. Cieszę się, że tak.
Hector Correa
4
Dziękujemy, możesz upuścić ToString, ponieważ indeksator AppSettings już zwrócił ciąg.
Ido Ran,
43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];
yogeswaran K
źródło
12
Poprawna odpowiedź. ToString()jest jednak zbędny.
anar khalilov
9
ToString może być niebezpieczne, jeśli wartości nie ma w konfiguracji aplikacji. Lepiej schwytać zwrócony obiekt i przetestować pod kątem wartości zerowej przed rozstrzygnięciem. Spróbuj uruchomić go, gdy „mysettings” nie jest w konfiguracji, a zobaczysz wyjątek pop. Zamiast tego coś takiego, co poniżej, może być bezpieczniejsze ... string key = "mysettings"; wartość ciągu = ConfigurationManager.AppSettings [klucz]; if (wartość == null) wartość = „nieznana wartość”;
Joe Healy
1
true, nie ma potrzeby .ToString (), ponieważ jest to ciąg znaków
Rola
2
@JoeHealy Możesz to skrócić i zwiększyć przejrzystość dzięki string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
zerowemu
Zastanawiam się, jaka jest różnica między tą odpowiedzią a kodem w pytaniu OP! Czy to nie to samo?
user1451111,
6

Jeśli program wywołujący to inny projekt, należy napisać konfigurację w projekcie programu wywołującego, a nie w wywołanym.

Szabla
źródło
6

Uważam, że to rozwiązanie jest bardzo pomocne . Używa C # 4.0 DynamicObject do zawijania ConfigurationManager. Zamiast więc uzyskiwać dostęp do takich wartości:

 WebConfigurationManager.AppSettings["PFUserName"]

masz do nich dostęp jako własność:

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

EDYCJA : Dodawanie fragmentu kodu na wypadek, gdyby link stał się nieaktualny:

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
źródło
2

Pełna ścieżka do tego jest

System.Configuration.ConfigurationManager.AppSettings["KeyName"]
Siddhartha
źródło
2

Będą dwa pliki Web.config. Myślę, że mogłeś pomylić z tymi dwoma plikami.

Sprawdź to zdjęcie:

kliknij ten link i sprawdź ten obraz

Na tym obrazku widać dwa pliki Web.config. Powinieneś dodać swoje stałe do tej, która znajduje się w folderze projektu, a nie w folderze views

Mam nadzieję, że to może ci pomóc

raja gangadhar
źródło
1

Ten problem występuje, jeśli ten projekt jest używany przez inny projekt. Upewnij się, że skopiowałeś klucze ustawień aplikacji do app.config lub web.config projektu nadrzędnego.

Karthikeyan Muthu
źródło
1

Możesz także wypróbować ten wiersz, aby uzyskać wartość ciągu z app.configpliku.

var strName= ConfigurationManager.AppSettings["stringName"];
Ram Beer Singh
źródło
0

przy założeniu ustawienia poniżej w pliku .config:

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

Spróbuj tego:

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

    public void MyMethod()
    {
        var myUsername = myKeys["PFUserName"];
        var myPassword = myKeys["PFPassWord"];
    }
}
Aiyoub Amini
źródło
-5

Niestety nie testowałem tego, ale myślę, że zrobiono to w ten sposób:

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

//usage: config.AppSettings["xxx"]
Lee Smith
źródło