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?


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"]

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"];

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.


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;
    }
}

2

Caminho completo, pois é

System.Configuration.ConfigurationManager.AppSettings["KeyName"]

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


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.


1

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

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

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"];
    }
}

-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"]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.