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.