2012-07-23 19 views
15

Tengo una biblioteca que contiene algunas clases de ayuda de Azure. Dentro de estas clases de ayuda, obtengo configuraciones tales como el nombre y la clave de la cuenta de Azure. Cuando se ejecuta en Azure, estas configuraciones se recogen del archivo de configuración de la nube (cscfg). Todo esto funciona bienCloudConfigurationManager no recoge ApplicationSettings desde app.config

Para probar la unidad de estas clases fuera de Azure (específicamente RoleEnvironment) creé las configuraciones de los mismos nombres de variable dentro del proyecto de prueba de la unidad. De hecho, estos se guardan en un archivo app.config y se editan a través de la sección de configuración que se encuentra en la sección de propiedades de mi proyecto de prueba. En lugar de crear mi propio método para abstraer las configuraciones de la nube de las configuraciones de web.config/app.config, decidí usar la clase CloudConfigurationManager. Sin embargo, cuando ejecuto mis pruebas unitarias, ninguna de mis configuraciones se recogen, así que simplemente obtengo nulos. Sin embargo, si cambio mi archivo app.config para utilizar la configuración en el formato 'appSettings' a continuación, entonces obtengo valores válidos. La desventaja de esto es que ya no puedo editar mis configuraciones usando la página del editor de configuraciones dentro de Visual Studio.

Así que mi pregunta es ¿estoy haciendo algo mal o esto es una limitación del administrador de configuración en la nube, por el cual solo puede recoger ajustes de la aplicación añadidos manualmente pero no se agrega la aplicación con el editor?

<appSettings> 
    <add key="Foo" value="MySettingValue"/> 
</appSettings> 

las obras anteriores, mientras que el siguiente no:

<applicationSettings> 
    <ComponentsTest.Properties.Settings> 
     <setting name="Foo" serializeAs="String"> 
     <value>MySettingValue</value> 
     </setting> 
    </ComponentsTest.Properties.Settings> 
</applicationSettings> 

Respuesta

30

El CloudConfigurationManager sólo es compatible con los AppSettings parte del web.config/app.config y tratarán de leer valores de aquí si la configuración falta en la configuración de Azure. La documentación indica que no leerá el web.config/app.config si la propiedad RoleEnvironment.IsAvailable es cierto (que se ejecuta en Azure), pero eso es incorrecto como podemos ver en el código fuente a continuación (no hay cheque para IsAvailable).

Puede echar un vistazo a la source para ver lo que sucede:

/// <summary> 
    /// Gets a setting with the given name. 
    /// </summary> 
    /// <param name="name">Setting name.</param> 
    /// <returns>Setting value or null if such setting does not exist.</returns> 
    internal string GetSetting(string name) 
    { 
     Debug.Assert(!string.IsNullOrEmpty(name)); 

     string value = null; 

     value = GetValue("ServiceRuntime", name, GetServiceRuntimeSetting); 
     if (value == null) 
     { 
      value = GetValue("ConfigurationManager", name, n => ConfigurationManager.AppSettings[n]); 
     } 

     return value; 
    } 

Como se puede ver, no es sólo una llamada a la normal ConfigurationManager clase que simplemente accede a los AppSettings.

+4

Probablemente es una ilusión, pero hubiera sido bueno que la documentación de Microsoft haya dicho esto. Gracias por la respuesta. –

+0

+1 muy bien hecho. Había planeado usar esto para una cadena de conexión. –

+0

@KingRoger, se indica en el [artículo msdn] (https://msdn.microsoft.com/en-us/LIBRARY/microsoft.windowsazure.cloudconfigurationmanager) sobre la clase. –

Cuestiones relacionadas