Hola!
Cuando una Cloud Service app que está funcionando desde hace meses deja de funcionar, sin dejar trazas de error. Sabes que es momento de calentar café, porque te esperan noches largas. Más aún si el no funcionamiento es esporádico y reproducirlo no es tarea trivial.
En este caso en particular el error no se trataba como una excepción sino que terminaba perdida como una mala Http Response. Para llegar a esta conclusión, tuve que romper la madre de todas las reglas en un Dev Team:
HE DEPURADO EL ENTORNO DE PRODUCCIÓN (bueno en realidad no es así, pero queda muy bien asustar a más de uno!)
Todavia recuerdo los dolores de cabeza que me daba llegar a un server de producción y ver instaladas herramientas de desarrollo. El caso extremo fue llegar a un cliente y ver que un gestor de transacciones online había dejado de funcionar porque … alguien habia matado la instancia de VisualCafe (todo el JBoss que soportaba el gestor de transacciones estaba siendo ejecutado con un F5 desde VisualCafe, y así duró varios días!).
En nuestro caso, lo extraño es que llegábamos a la 2da frase que más dolores de cabeza nos da a los desarrolladores
EN MI ORDENADOR FUNCIONA !!!
Y así era, en los entornos locales con el emulador de Azure todo funcionaba perfectamente, sin embargo en ejecución aparecían los fantasmas. Aquí había varias opciones, una de ellas involucraba IntelliTrace, la otra era mejor
La solución fue crear una nueva Cloud Service App en Azure, desplegar nuestra solución allí (que es más fácil de decir que de hacer por la cantidad de dependencias que tiene) y esperar que allí también deje de funcionar. (En la original hay trabajando personas de China, Brazil, USA, Francia, etc. meterle mano a esta es jugar a ser Dios …)
Por suerte, en este nuevo entorno de prueba el error se daba también esporádicamente, y en el mismo teníamos mano para AGRADECER A TODO EL EQUIPO DE MICROSOFT DE AZURE POR LA 2DA OPCION EN LA SIGUIENTE IMAGEN:
Nos hemos conectado en modo depuración a una instancia en ejecución de un website en una Cloud Service App de Azure !!! Esta feature fue anunciada hace un tiempo, y son del tipo de noticias que las escuchas y que no parecen tan importantes hasta que las necesitas.
Pues bien, después de llegar a la excepción y de un poco de buceo por el código llegamos a la excepción
{“Could not load file or assembly ‘Microsoft.WindowsAzure.ServiceRuntime, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The system cannot find the file specified.”:”Microsoft.WindowsAzure.ServiceRuntime, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″}
Que era un balde de agua fría, ya que el modelo de trabajo no había cambiado en bastante tiempo. Despues de ver a algunas personas con problemas similares (1, 2, 3, y 4), llegamos a una solución que todavía no me ha convencido del todo.
- Actualizar todos los proyectos que utilicen NuGet pkgs de Azure a la ultima versión. Esto es coherente y es parte de lo hacemos en cada actualización del SDK.
- Modificar las Dll References con la propiedad “Copy Local = True”, para que se incluyan las mismas dentro del paquete a desplegar. En este caso las dlls eran: Microsoft.WindowsAzure.Configuration, Microsoft.WindowsAzure.Diagnostics, Microsoft.WindowsAzure.Storage y … Microsoft.WindowsAzure.ServiceRuntime. Lo de esta última es increíble.
- Agregar en el web.config una redirección de assemblies para que se utilicen las versiones correctas. Algo del tipo
<assemblyIdentity name=”Microsoft.WindowsAzure.ServiceRuntime” culture=”neutral” publicKeyToken=”31bf3856ad364e35″ />
<bindingRedirect oldVersion=”0.0.0.0-2.3.0.0″ newVersion=”2.3.0.0″ />
</dependentAssembly>
Si bien estos pasos son coherentes, el 2do donde hemos tenido que incluir Microsoft.WindowsAzure.ServiceRuntime con copia local = true, me da que pensar. Según mi entendimiento, una Cloud Service App debería incluir estos componentes Out of the Box.
Pues bien, esta solución funciona y ahora me tocará preguntarle a los cracks de Azure: @ibonilm o @quiqu3 que me he perdido en el camino.
PD: en el camino me queda explicar también el siguiente error:
Message=Could not load file or assembly ‘msshrtmi, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The system cannot find the file specified.
Source=Microsoft.WindowsAzure.ServiceRuntime
FileName=msshrtmi, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Este, da para unas cervezas o tequilas …
Update: Gracias Gisela (@0Gis0) que me ha aclarado varias cosas! y ha escrito un excelente post sobre cómo depurar Azure Cloud Service apps desde Visual Studio (link)
Saludos @ Home
El Bruno
Leave a comment