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?


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

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

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.


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

2

El camino completo para ello es

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

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


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.


1

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

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

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

-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"]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.