SetConfigurationSettingPublisher needs to be called before FromConfigurationSetting can be used

Este error de Windows Azure nos indica que el método FromConfigurationSetting no puede usarse para obtener el valor de una variable de configuración del servicio cloud, pues para poderse usar, es necesario haber establecido un publicador de ajustes de configuración.

clip_image002

Se soluciona sencillamente inicializando el publicador con éste código estándar:

CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
{
configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
});

Aquí vemos como Windows Azure es muy flexible pues no nos limita a extraer las variables de configuración de un único archivo (como en el Web.config en el caso de ASP.NET) sino de donde queramos a través de un delegado anónimo.

Este código se puede poner por ejemplo en el inicializador del WebRole, para que quede disponible durante el resto del ciclo del vida del servicio.

Pero en este momento algunos de ustedes deben estarle gritando a la pantalla: “Pero si yo ya hice eso!!!”

No se preocupen… en este caso lo que sucede es que puede que ya estén usando el modo Full IIS propio de la versión 1.3 de las herramientas y SDK de Azure. Esto implica que a pesar de que ya escribieron el inicializador del Publisher, este no se ejecutó en el IIS (w3wp.exe). El inicializador del publicador de configuraciones (aquel que nos permite leer programáticamente las variables que ponemos en los archivos de configuración de los roles) no se inicializará en el sitio Web (que corre en el IIS) pues el código de inicialización que teníamos antes, solo funciona en el entorno de ejecución del WebRole (WaWebHost.exe) pero cuando usamos Full IIS lo que pasa es que el sitio web se ejecuta en el IIS (w3wp.exe) mientras el inicializador del WebRole lo hace en el WaIISHost.exe. Por ende cualquier llamado al archivo de configuraciones desde el sitio Web fallará pues el publicador no se inicializó allí.

Entonces hay tres opciones de solución.

1. Elimine la sección de Sites para indicar que todo correrá en HWC (Esto en el caso en que no requiera múltiples sitios en el mismo web role.

2. Ejecute la inicialización del Publisher en el Application_Start del Global.asax

3. No use el Publisher para obtener los valores de los setting, sino un código similar a:
var storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("ConnectionString")); (Esta sería la opción menos clara y menos recomendada, a menos de que solo necesite llamar un par de variables).