Lectura de una clave desde la Web. Configuración mediante ConfigurationManager

284

Estoy tratando de leer las claves del Web.configarchivo en una capa diferente a la capa web (misma solución)

Esto es lo que estoy intentando:

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

Y aquí está mi appSettingsen el Web.configarchivo:

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

Cuando depuro el código usernamey passwordson justos null, no se obtiene el valor de las claves.

¿Qué estoy haciendo mal para leer estos valores?

sarga
fuente
¿Cómo se accede a este segundo proyecto desde su sitio web?
Dan Atkinson
13
Su sintaxis es correcta . Probablemente editó el archivo web.config incorrecto, por eso es que regresa NULL. Comentario tardío pero nadie señaló esto.
Hammad Khan
1
Eso es lo que me pasó, estaba en Vistas web.config.
JQII
1
Solo el proyecto web tiene acceso al objeto System.Configuration.ConfigurationManager.AppSettings. Otras capas no pueden acceder a este objeto ya que no implementan System.Web.
Hashim Akhtar

Respuestas:

475

Intente usar la clase WebConfigurationManager en su lugar. Por ejemplo:

string userName = WebConfigurationManager.AppSettings["PFUserName"]
Héctor Correa
fuente
2
Gracias por su respuesta, lo intenté como me lo recomendó y todavía obtengo el mismo resultado. De hecho, ahora recibo una NullReferenceException en ToString ()
twal
Si obtiene una excepción nula, significa que no está encontrando la configuración. Intente hacer algo como esto: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" y probablemente obtendrá un valor nulo, lo que significa que no está encontrando la configuración solicitada.
Héctor Correa
21
¿Está seguro de que la configuración está en la web.config correcta? (He cometido el error anterior de volcar mis valores en la web.config en la carpeta "Vistas" y perdí un montón de tiempo para solucionar problemas por los que no funciona como se esperaba.)
Héctor Correa
Excelente. Me alegro de que lo haya hecho.
Héctor Correa
44
Gracias, puede soltar ToString porque el indexador de AppSettings ya devuelve cadena.
Ido corrió
43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];
yogeswaran K
fuente
12
Respuesta correcta. ToString()aunque es redundante.
anar khalilov
9
ToString puede ser peligroso si el valor no está en la configuración de la aplicación. Es mejor atrapar el objeto devuelto y probar nulo antes de resolver. Intente ejecutarlo cuando "mysettings" no esté en la configuración y verá la excepción emergente. En cambio, algo como lo que está debajo podría ser más seguro ... string key = "mysettings"; valor de cadena = ConfigurationManager.AppSettings [clave]; if (value == null) value = "valor desconocido";
Joe Healy
1
Es cierto que no hay necesidad de .ToString () ya que es una cadena
Rola
2
@JoeHealy Puede acortar eso y aumentar la claridad con el operador de string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
fusión
¡Me pregunto cuál es la diferencia entre esta respuesta y el código en la pregunta de OP! ¿No son lo mismo?
user1451111
6

Si la persona que llama es otro proyecto, debe escribir la configuración en el proyecto de la persona que llama, no en el llamado.

Sable
fuente
6

Encontré esta solución muy útil . Utiliza C # 4.0 DynamicObject para ajustar el ConfigurationManager. Entonces, en lugar de acceder a valores como este:

 WebConfigurationManager.AppSettings["PFUserName"]

accede a ellos como una propiedad:

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

EDITAR : Agregar fragmento de código en caso de que el enlace se vuelva 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
fuente
2

El camino completo para ello es

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

Habrá dos archivos Web.config. Creo que puede haber confundido con esos dos archivos.

Mira esta imagen:

haga clic en este enlace y verifique esta imagen

En esta imagen puede ver dos archivos Web.config. Debe agregar sus constantes a la que está en la carpeta del proyecto y no en la carpeta de vistas

Espero que esto te pueda ayudar

raja gangadhar
fuente
1

Este problema ocurre si este proyecto está siendo utilizado por otro proyecto. Asegúrese de copiar las claves de configuración de la aplicación en el proyecto principal app.config o web.config.

Karthikeyan Muthu
fuente
1

También puede probar esta línea para obtener el valor de cadena del app.configarchivo.

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

con la siguiente configuración en el archivo .config:

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

prueba esto:

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

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

Lo siento, no he probado esto, pero creo que se hace así:

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
fuente