Lendo uma chave do Web.Config usando o ConfigurationManager

284

Estou tentando ler as chaves do Web.config arquivo em uma camada diferente da camada da web (mesma solução)

Aqui está o que estou tentando:

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

E aqui está o meu appSettingsno Web.configarquivo:

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

Quando depuro o código usernamee passwordsou justo null, não está obtendo o valor das chaves.

O que estou fazendo de errado para ler esses valores?

twal
fonte
Como esse segundo projeto está sendo acessado pelo seu site?
Dan Atkinson
13
Sua sintaxe está correta . Você provavelmente editou o arquivo web.config errado e é por isso que ele retorna NULL. Comentário tardio, mas ninguém apontou isso.
Hammad Khan
1
Foi o que aconteceu comigo: eu estava no web.config do Views.
JQII
1
Somente o projeto da Web tem acesso ao objeto System.Configuration.ConfigurationManager.AppSettings. Outras camadas não podem acessar esse objeto, pois não implementam System.Web.
Hashim Akhtar

Respostas:

475

Tente usar a classe WebConfigurationManager. Por exemplo:

string userName = WebConfigurationManager.AppSettings["PFUserName"]
Hector Correa
fonte
2
Obrigado pela sua resposta, tentei como você recomendou e ainda assim obtém o mesmo resultado. Na verdade, agora recebo uma NullReferenceException no ToString ()
twal
Se você receber uma exceção nula, significa que não está encontrando a configuração. Tente fazer algo assim: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" e você provavelmente receberá um valor nulo, o que significa que não está encontrando a configuração solicitada.
Hector Correa
21
Você tem certeza de que as configurações estão no web.config correto? (Eu cometi o erro antes de dumping meus valores no web.config na pasta "Visualizações" e perdeu uma tonelada de tempo resolvendo problemas por que ele não está funcionando como esperado.
Hector Correa
Ótimo. Estou feliz que sim.
Hector Correa
4
Obrigado, você pode descartar o ToString porque o indexador do AppSettings já retorna a string.
precisa
43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];
yogeswaran K
fonte
12
Resposta correta. ToString()é redundante.
Anar khalilov
9
ToString pode ser perigoso se o valor não estiver na configuração do aplicativo. É melhor interceptar o objeto retornado e testar o valor nulo antes de resolver. Tente executá-lo quando "mysettings" não estiver na configuração e você verá a exceção pop. Em vez disso, algo como o que está abaixo pode ser mais seguro ... string key = "mysettings"; valor da cadeia = ConfigurationManager.AppSettings [key]; if (value == null) value = "valor desconhecido";
21715 Joe Healy
1
verdade, não há necessidade para o .ToString () uma vez que é uma string
Rola
2
@JoeHealy Você pode encurtar isso e aumentar a clareza com o operador coalescente nulo:string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
Zenexer 31/08/16
Gostaria de saber qual é a diferença entre esta resposta e o código na pergunta do OP! Eles não são os mesmos?
user1451111
6

Se o chamador for outro projeto, você deve gravar a configuração no projeto do chamador, não o chamado.

Sabre
fonte
6

Achei esta solução bastante útil . Ele usa o C # 4.0 DynamicObject para quebrar o ConfigurationManager. Então, em vez de acessar valores como este:

 WebConfigurationManager.AppSettings["PFUserName"]

você os acessa como uma propriedade:

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

EDIT : Adicionando trecho de código no caso de link ficar obsoleto:

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
fonte
2

Caminho completo, pois é

System.Configuration.ConfigurationManager.AppSettings["KeyName"]
Siddhartha
fonte
2

Haverá dois arquivos Web.config. Eu acho que você pode ter confundido com esses dois arquivos.

Verifique esta imagem:

clique neste link e verifique esta imagem

Nesta imagem, você pode ver dois arquivos Web.config. Você deve adicionar suas constantes àquela que está na pasta do projeto e não na pasta views

Espero que isso possa ajudá-lo

raja gangadhar
fonte
1

Esse problema ocorre se este projeto estiver sendo usado por outro projeto. Certifique-se de copiar as chaves de configuração do aplicativo para app.config ou web.config do projeto pai.

Karthikeyan Muthu
fonte
1

Além disso, você pode tentar esta linha para obter o valor da string do app.configarquivo.

var strName= ConfigurationManager.AppSettings["stringName"];
Ram Beer Singh
fonte
0

assumindo a configuração abaixo no arquivo .config:

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

tente isto:

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

    public void MyMethod()
    {
        var myUsername = myKeys["PFUserName"];
        var myPassword = myKeys["PFPassWord"];
    }
}
Aiyoub Amini
fonte
-5

Desculpe, eu não testei isso, mas acho que é feito assim:

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
fonte