Windows Azure Caching (Preview) I: Introducción y análisis de la caché “Co-located”

imageAzureCachingPreview_Shared

Desde hace ya un tiempo Windows Azure cuenta con un sistema de Cache (o Caching) denominado “Windows Shared Azure Cache”, sin embargo junto a las nuevas carácterísticas, ahora es posible conseguir hacer uso de Caché en nuestras arquitecturas de una manera mucho más fácil e intuitiva.  Eso si, antes de continuar, es conveniente saber que, “Windows Azure Caching (Preview)” no esta soportado aún en entornos de Producción, no obstante, lo estará en breve !

Windows Azure Caching puede reducir el coste e incrementar la escalabilidad de otros almacenes tales como SQL Azure o Azure Storage.

Pero, ¿Cúal es la diferecia entre Windows Shared Azure Cache y Windows Azure Caching (Preview)? Pues bien, la diferencia principal radique en que el primero se trata de un Servicio de Cloud dedicado mientras que el segundo, es configurado dentro de una máquina específica (asignando un porcentaje de recursos de la misma) o configurado dedicando una máquina virtual explicitamente para este propósito. A estos dos tipos se le denomintan Cache “Co-located” y “Dedicated” respectivamente.

Para el primer tipo (Windows Shared Azure Cache) existen laboriatorios On-Line que ejemplifican claramente su uso:

Vemos ahora un poco más en detalle, cuales son los dos tipos de topologías de Azure Caching Preview y las diferencias entre ellas:

  • Modo Co-located. La caché comparte los recursos de la VM de Azure: CPU, Memoria,  y ancho de banda junto a la aplicación hosteada.
    • Caché basada en Memoria.
    • No soporta Notificaciones. Eventos asíncronos producidos por operaciones que ocurren en el cluster de caché.
    • No permite evitar la política de desalojo o “Eviction” en caso de “llenado” de la caché, y por tanto, siempre tendrá el valor LRU: “Least recently used”
  • Modo Dedicado.  Instancias de un role dedicado explicitamente para caché.
    • Orientado a Caché Distribuido y basado en Microsoft AppFabric 1.1
    • Soporta Notificaciones
    • Permite deshabilitar la política de “Eviction
    • Alta disponibilidad
    • Soporta Regiones (subgrupos de items de cache) y Tags (anotaciones descriptivas sobre los items de cache), muy utilies para búsquedas dentro de una region.

En este enlace podemos encontrar más detalle sobre las diferencias en cuanto al uso del API  de Caching (Co-located Caching VS Role-based Caching (Preview)).

A continuación, como configurar el tipo de Caché “Co-Located”:

Creamos un proyecto de tipo “Windows Azure Cloud Service” desde Visual Studio con el nombre “WindowsAzureSharedCache” y elegimos un Role de tipo “Asp.Net MVC 4 Web Role” (Razor) manteniendo el nombre, “MvcWebRole1”:

image

Creamos un Controller y las vistas adecuadas para el tratamiento de la Caché además de incluir una nueva opción de menú “Caching” en “_Layout.cshtml

image

Incluimos en el controller el siguiente código:

   1: [HttpPost]

   2: public ActionResult Save(CacheModels model, string returnUrl)

   3: {

   4:     if (ModelState.IsValid)

   5:     {

   6:         DataCacheFactory cacheFactory = new DataCacheFactory();

   7:         DataCache cache = cacheFactory.GetDefaultCache();

   8:  

   9:         // Save data in Azure Caching

  10:         cache.Put(cacheKey1, model.DataToCache);

  11:  

  12:         if (Url.IsLocalUrl(returnUrl))                

  13:             return Redirect(returnUrl);                

  14:         else                

  15:             return RedirectToAction("Load", "Caching");                

  16:     }            

  17:     return View(model);

  18: }

  19:  

  20: public ActionResult Load()

  21: {

  22:     DataCacheFactory cacheFactory = new DataCacheFactory();

  23:     DataCache cache = cacheFactory.GetDefaultCache();

  24:  

  25:     var result = cache.Get(cacheKey1) as string;

  26:  

  27:     ViewBag.CacheValue = result;

  28:  

  29:     return View();

  30: }

Configuramos las opciones de caché desde las propiedades del proyecto :

image

Para el proyecto ASP.NET MVC, añadir las referencias  a “Windows Azure Caching Preview” usando “Manager NuGet Packages…”.

image

El paso anterior, nos facilitará el camino evitanto tener que añadir manualmente las referencias siguiente:

image

Además de la siguiente configuración del “web.config”:

   1: <configSections>

   2:    <section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere" />   

   3:  </configSections>

   4:  <connectionStrings>

   5:  

   6: <dataCacheClients>

   7:    <tracing sinkType="DiagnosticSink" traceLevel="Error" />

   8:    <dataCacheClient name="default">

   9:      <autoDiscover isEnabled="true" identifier="MvcNewAzureStore" />     

  10:      <!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />-->

  11:    </dataCacheClient>

  12:  </dataCacheClients>

Llegado este punto, unicamente es nesario tener en cuenta el parámetro “identifier” de la sección <autoDiscover> anterior, que coincidirá con el nombre del Role de Azure (“MvcWebRole1” según nuestro ejemplo):

image

Para comprobar que estamos haciendo uso de Cache de tipo “Co-located”, hacemos un deploy en Azure habilitando la conexión remota.

image

Una vez hemos realizado el despligue en Azure, podemos observar que el tiempo de despligue es un poco superior, puesto que se lanzan una serie de tareas “Startp tasks”. Puede observarse este mensaje en el ya, “casi” antiguo portal: “System startup tasks are runing…

image

Realizado el despligue, navegamos a la opción de menu “Caching” que ofrece dos páginas: “Save” y “Load”. En la primera, se almacena el dato en cache y en la segunda, se obtiene el dato almacenado se muestra:

image

Como hemos habilitado la conexión remota durante el despliegue, accedemos mediante terminal server a la instancia de nuestro role “MvcWebRole1” y desde allí: Realizamos un restart del site, o un reciclado del pool, o un “IISReset” o, incluso, un reinicio del servicio “World Wide Web Publishing Service”. Tras esta acción, el valor de cache permanece y si navegamos a la página “Load” podemos comprobar que el valor permanece.

image

Adcicionalmente, podemos comprobar la memoria dedicada a la Caché Co-located, cuyo valor ronda los 530MB  iniciales aproximadamente, valor indicado por el proceso “CacheService.exe” y que se corresponde con el 30% establecido en las propiedades del proyecto de tipo Cloud.

image

Hasta aquí el uso de Caché  “Co-Located” con Windows Azure Caching (Preview).  Veremos más adelante, en posts sucesivos el uso de la Caché Dedicada, diferentes opciones y configuración con Azure Caching Preview, uso de cache para Session y  Output Cache, capacity planning y  tamaños de cache según tamaños de VMs y mucho más.

Otras referencias:

¡Ahora no hay motivos para no sacarle partido a nuestra/s instancia/s de Azure. Haz lo mismo con mejor performance y menor coste!

Saludos “and, happy Azure Caching
Juanlu

Tip: ¡ Actualiza “Azure Storage Explorer 5 Preview” !

Windows Azure Big

Ya tenemos disponible la actualización de “Azure Storage Explorer 5 Preview”,

image

Con las novedades:

  • Nueva interfaz de usuario, similar a la del nuevo portal HTML 5 de Windows Azure
  • Soporte para configuración y visualización logging

image

  • Soporte para configuración y visualización de monitoring

image

  • Uso de las dlls de “Windows Azure SDK 1.7”
  • Solución de fixes

Saludos noticieros
Juanlu

Windows Azure Web Sites: Integración continua con TFS Preview

WindowsAzurePreview

En esta ocasión, y continuando el post anterior,  veamos como tener el código del “Azure Web Site” en “TFS Service” y poder  acceder desde Visual Studio 2012 RC y lo mejor, veamos como funciona la integración continua tras cada “Check In” de código.

Una vez creado nuestro “Azure Web Site”, realizado o no el despligue desde Visual Studio:

  • Accede al nuevo portal de Azure y haz clic en la opción “Set Up TFS publishing” de la sección “quick glance”

image

  • Introduce el nombre del TFS “Service Preview”.   Nota: Para crear tu “TFS Service”, sigue estos pasos.

image

  • Acepta la petición de permisos

image

  • Selecciona el proyecto de TFS a asociar al “Azure Web Site”

image

  • Valida la operación y, todo listo.

image

  • Lanza el Visual Studio dese la opción “VISUAL STUDIO” de la barra de comandos, conectando así directamente el VS con el TFS Service.
  • Si lo prefieres, abre el Visual Studio y conectate al TFS normalmente intruduciendo como servidor: “<myTFSService>.tfspreview.com”.
  • Ahora que estas conectado, añade la solucion a TFS como lo haces normalmente.

image

  • Realiza el despliegue según comenté en el post anterior si aún no lo has hecho, para que “Azure Web Site”  vincule el proyecto Web.
  • Haz el Check-In correspondiente.
  • Ahora, cada vez que hagas un cambio en el código y realizes el nuevo “Check-In”, se realizará el despliegue automático.

image

  • La “Integración Continua” está lista.

image

Hasta aquí, una vez más, Windows Azure haciéndonos más fácil el desarrollo en la nube.

Por el momento tenemos uso gratuito de  “TFS Service Preview”, ¡Aprovechemos para sacarle jugo y hacer pruebas!

Saludos
Juanlu, ElGuerre

Windows Azure Web Sites: “Web Deploy” en unos cuantos clicks !!!

visual_studio_logo

&  WindowsAzurePreview

 

Windows Azure incluye muchas nuevas características como ya comenté en un post anterior. Una de ellas es el “Web Sites”, objeto de este post. Con ella, es posible, con varios click de ratón, desplegar en Azure cualquiera de nuestras aplicaciones web, tanto nuevas como ya existentes. ¡Esto abre un nuevo camino a la migración de aplicaciones hacia la nube!. 

Con esos pocos click conseguiremos:

  1. Alta escalabilidad en entornos cloud.
  2. Despliegue instántaneo, y muy sencillo
  3. Integración continua con “TFS Service Preview”

Y todo ello, desde Visual Studio 2012 RC.

Veamos un step by step práctico:

  •  
    • Crear un nuevo “Web Site”  directamente desde el portal de Azure accediendo a la url  “https://manage.windowsazure.com
    • Click en  “+ NEW
    • Introducir la url que va a tener la nueva aplicación web, “MyAzureWebSite”.
    • Click en “CREATE WEB SITE” y …

image

  •  
    • Tras unos pocos segudos el “Web Site” de Azure ha sido creado.
    • Al clicar sobre el, accederemos al detalle del mismo con las siguientes opciones:
      • “DASHBOARD”. Además de como su propio nombre indica, tambien nos permite hacer algunas operaciones tals como, obtener información para el despliegue, configuración de TFS, etc.
      • “MONITOR”: Aquí no voy a dar detalle, ella misma habla por si sóla.
      • CONFIGURE: Configuración del framework (v2.0 ó v4.0), diagnosticos, claves de “app settings”, “connections strings”,  y “default documents”.
      • SCALE: Esta es la opción más importante, donde podremos optar a hacer que nuestro Web Site sea “Shared” o “Reservado” (Multitenant o no), de manera que nuestro site compartirá recursos con otros o no respectivamente. Al cambiar esta opción, tenemos que tener cuidado de no sobrepasar los límites de nuestra subscripción, principalmente si estamos probando y no queremos pagar más de lo necesario. En cualquier caso, siempe serémos avisados con el pertinente mensaje  “SPENDING LIMIT WARNING”. Al sobrepasar dicho límite podremos optar por dotar a nuestra aplicación de un escalado vertical (“Scale UP”) y en cualquier caso, tanto sobrepasando este límite como si no, siempre podremos optar, adiconalmente, por un escalado horizontal (“Scale Out”) hasta un máximo de tres instancias. ¡Parecen pocas por el momento, supongo que tendremos la opción de poder incrementar más este número en un futúro no muy lejano!

      image

  •  
    •  
      • LINKED RESOURDES: Conexión y uso de un SQL Azure. En un futuro optaremos a una conexión con Azure Storage.

Hasta aquí, simplemente hemos creado y configurado nuestro “Web Site”, ahora vemos como hacer el despliegue:

  •  
    • Acceder a la opción  “DASHBOARD” antes comentada y, concretamente a la opción “Download publish profile” de la sección “quick glace”. Al hacer click obtendremos un fichero de configuración que descargaremos nuestro disco duro. ¡Lo dejamos ahí, por el momento!
    • Crear un proyecto Web (ASP.NET, MVC 3, MVC 4, et )  desde visual studio.
    • Click con el botón derecho del raton sobre el proyecto y “Publish…
    • En la pestaña de “Profile”, seleccionar el fichero antes descargado y seguidamente obtendremos una ventana con la configuración necesaria para nuestro despliegue:

image

  • “Next >”, “Next >” y, en la pestaña de “Preview” podremos ver que es lo que se va a desplegar exactamente:

image

  • “Publish” y todo listo. Tras un par de minutos nuestra aplicación estar ejectuandose en Azure.

Para no hacer más largo el post, lo dejo aquí y, en un siguiente post veremos como integrar este desarrollo con “TFS Service Preview” en pocos clicks y con la misma sencilled que este depliegue despliegue.

Saludos
Juanlu, ElGuerre

El camino de Windows Azure continua. Integración con Visual Studio 2012 RC y Windows 8 Release, Nuevo portal y más “features”

 

WindowsAzurePreview

 

 

Después de unos cuantos días con problemas con el PC, al final he podido conseguir tener todo listo, Windows 8 Release Preview, Visual Studio 2012 RC y Windows Azure Tools June 2012. Todo parece que está muy estable y funciona bastante bien y rápido. El equeipo de Azure se ha dado prisa en con las Tools adecuadas para VS2012, pero creo que el equipo de Windows Phone no ha podido llegar a tiempo, ¡ahora que quería comenzar a pegarme con Windows Phone en el nuevo entorno!, En fin, cómo VS2010 y VS2012 pueden convivir,  habrá que esperar a esas Tools para tener un único entorno de trabajo.   Existen algunas otras imcompatibilidad que pueden verse aquí.

Por cierto, si alguien intenta instalar Windows 8 Release Preview, que lo haga desde cero. La “actualización”/instalación desde la versión Preview, puede causar algún problema con el reconocimiento de Drivers !!! Confused smile

Veamos ahora que nos trae de nuevo Windows Azure. Y lo mejor, como comentaba antes, al fin incluido en Visual Studio 2012 RC:

  • Nuevo proyecto, para .NET Framework 3.5 y .NET Framework 4.0.

image

    • Nuevos tipos de roles: “Cache Worker Role” y “Worker Role with Service Bus Queue”

image

  • Actualización/conversión de un proyecto existente

image

  • Configuración para “Windows Azure Caching

image

  • Requerimiento de certificado “.pfx” en la carpeta “certificates” de cada “Hosted Services”. ¡Aquí ha habido un cambio, creo que debido al nuevo portal basado en HTML 5! Eso sí, bastante más intuitivo, aunque en el día a día, prueba tras prueba puede suponer un poco más trabajo.

image

  • Nuevo portal basado en HTML 5.  Ahora la administración desde el Portal de Windows Azure no es un impedimiento para algunos. Ahora es posible desde IPad, Windows Phone, etc.

image

  • Despliegue directo desde Visual Studio 2012 RC para aplicaciones web con “Web Deploy” sin necesidad de hacer despligues típicos de Windows Azure. ¡Ahora no es necesario conocer nada de Windows Azure para hacer este tipo de despliegues Web y además en tan solo varios clicks !
  • Integración continua con Azure TFS Preview.

image

Hasta aquí unas cuantas pinceladas de lo que tenemos encima de la mesa, a partir de aquí, a profundizar en sucesivos posts.

Saludos @Nuvedosos
Juanlu, ElGuerre

Sencillez de autoescalado en Windows Azure con “WASABi”

 

Windows Azure Big Muy buenas,

Desde hace algún tiempo quería realizar algunas pruebas en profundidad con  “WASABi” (MICROSOFT ENTERPRISE LIBRARY 5.0 INTEGRATION PACK FOR WINDOWS AZURE  AUTOSCALING APPLICATION BLOC).

La semana pasada, nuestro compañero, Luis Panzano indico en en este post los pasos más importantes para llevar a cabo una prueba/demo muy fácil y rápida, así que aprovecho la misma para profundizar y resolver algunas dudas que se plantean por los foros de Azure.

Antes de nada, me gustaría aclarar, que para el autoscalado, se utilizará un WorkerRole, quien será el encargado de analizar en todo momento la configuración y reglas de escalado a partir de ficheros de los configuración.

Detalle de los pasos para trabajar con WASABi:

  1. Acceder y descargar los prerrequisitos necesarios desde aquí.
  2. Role o nodo a escalar (ej.: Aplicación web):
    • Indicar en los ficheros de configuración de los proyectos  “ServiceDefinitios.csdef” y “ServiceConfiguration.*.cscfg”, el AccountName y AccountKey del “Azure Storage Account”.
    • Añadir una nueva cadena de conexión (“ConfigurationSettings”) en esta demo, para hacer uso de una cola de Azure, que será monitorizada por el “AutoScaler” en función de su número de elementos de la misma. Si no se utilizará el número de elemento de la cola, no sería necesario.
    • Desplegar la aplicación en Azure.
  3. Worker Role, AutoScaler (El autoescalador):
    • Indicar en los ficheros de configuración de los proyectos  “ServiceDefinitios.csdef” y “ServiceConfiguration.*.cscfg”, el AccountName y AccountKey del “Azure Storage Account”.
    • Incluir el thumbprint de un certificado en los fichero “*.cscfg” en la sección <certificates>, teniendo como “Store Location”, LocalMachine o CurrentUser independientemente.
    • Configurar el “app.config” con la información necesaria para WASABi. Puede hacerse desde la consola de EntLib que permite la configuración del autoscalado mas gráficamente:

image

    • Rules-store.xml: Es el nombre del fichero donde se configuran las reglas de autoescalado. Aquí puede obtenerse más detalle sobre todos sus atributos. Una de las cosas curiosas de este fichero es que el valor del “timespan” del  operando “queueLength” no puede ser inferior a “00:05:00”, en cuyo caso se producirán las excepciones:
      • A first chance exception of type ‘System.ArgumentOutOfRangeException’ occurred in Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.dll
      • A first chance exception of type ‘System.InvalidOperationException’ occurred in Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.dll
<operands>

    <queueLength alias="QueueLengthAvg" queue="cola-wasabi" aggregate="Last" timespan="00:05:00"/>

</operands>

    • Services-information-store.xml: Es el nombre del fichero donde se indica toda la información necesaria para que el AutoScaler pueda acceder a la subscripción de Azure y poder realizar el incremento o disminución de instancias: SubscriptionId, información del certificado local y subido a Azure, y muy importante, para cada servicio, el “DNS Prefix” y el nombre del Role.
    • Al ejecutar el AutoScaler desde el Emulador de Azure, se podrán producir errores, que pueden verse en en el output:
      • A first chance exception of type ‘Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.Security.CertificateException’ occurred in Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.dll
      • A first chance exception of type ‘Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.Security.CertificateException’ occurred in Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.dll
      • A first chance exception of type ‘Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.ServiceManagement.ServiceManagementClientException’ occurred in Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.dll
    • Indicar el valor “CurrentUser”  para el attributo “certificateStoreLocation” además de corroborar en la consola de certificados que este existe y se corresponde con el valor del  “certificateThumbprint”. Esto es debido en muchos de los casos a Windows 8, que como ya he comentado alguna vez, es bastante más exhaustivo con los permisos
    • Ambos ficheros de configuración (XML) tienen sus esquemas “AutoscalingRules.xsd” y “AutoscalingServiceModel.xsd” que se encuentran junto a la descarga de WASABi y que será recomendable incluir en el proyecto “AutoScaler” a fin de que la edición de la configuración sea más sencilla.
    • WasabiStorageAccount: Es el nombre del Connection String referente al “Storage Account de Azure” donde se encuentran los ficheros antes indicados. Es decir, los ficheros anteriores deberán almacenarse en dicha cuenta bajo el container “autoscaling” que deberá generarse manualmente y que tendrá que coincidir con el valor de atributo “Blob Container Name” (según puede verse indicado por la flecha en la figura anterior).
    • Si no se quiere hacer uso del Storage de Azure para almacenar los ficheros de recursos, bien, porque se está trabajando en una solución híbrida, bien porque se está probando en local, etc, puede optarse por cambiar el “Rules Store” y el “Service Information Store”, e indicar una ruta física. Adicionalmente siempre puede establecerse un almacenamiento “Custom”.

image

Finalizada la fase de configuración, y sin necesidad de desplegar en Azure, el AutoScaler esta listo. Siguiendo con la Demo, cuando la cola tiene tres elementos, y una vez hayan transcurridos 5 minutos desde la inserción del último elementos, la nueva instancia comenzará a ponerse en marcha:


image

IMPORTANTE: Si el “AutoScaler”, necesita ser ejecutado en más de una instancia, debido al la gran carga de reglas de autoescalado o al alto número de roles que pueda tener la aplicación, es posible, que más de una de estas instancies evalué las reglas de autoescalado, lo que implicaría “un doble autoscalado” no deseado. Para evitar esto, el “AutoScaling Application Block” permite indicar un valor “true”, para la propiedad “Use Blob Execution Lease” como puede verse en la siguiene figura.  No obstante, si este no es el caso, es recomendable dejar este valor a “false” para  evitar “overhead”.

image

El “Service Management Request Tracker”, permitirá habilitar mensajes de log durante el escalado, tanto de éxito como de fallo. Para ello, el “AutoScaling Application Block” utiliza automáticamente una cola de Windows Azure “requesttracker” donde recoge dichos mensajes.

image

Es importante conocer, que el “AutoScaling Application Block”, utiliza el valor “utcOffset” para convertir información de configuración de tiempo al formato UTC que es el que utiliza utiliza Windows Azure. “Michael S. Collier” comenta este tema y otros más en su blog.

Y por último comentar que tras algunos intentos, y tras el error “‘Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.DataPointsCollection.DataPointsCollectionException’ occurred in Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.dll”, el AutoScalado de una aplicación en local parece que por el momento no es posible, así que tendremos que “hilar fino” con las reglas.

Y, como dirían en mi pueblo, ¡que ustedes lo escalen bien!

Juanlu, ElGuerre

Si necesitas más detalle, siempre puedes echar un vistazo al “How to”.

Windows 8 Preview & Azure Emulator Problems. Hosted Web Core(HWC) es una solución !

Windows Azure BigA partir de la versión 1.3 del SDK de  Windows Azure, el hosting de los Web Roles se hace sobre una cuenta con permisos limitados, y si a esto le sumas que “Windows 8 Comsumer Preview” es bastante más restrictivo con ellos, es posible que te encuentres con esta problemática.

Si has instalado Visual Studio 11, este, no soportada la integración con proyectos de tipo “Windows Azure Project”, así que por el momento, Visual Studio 2010 sigue siendo necesario para este tipo de desarrollos.

 

Reproducción del error:

Antes de nada será necesario lanzar el Visual Studio como Administrador (Run as Administrator) para que el emulador pueda funcionar. ¡Curioso, pero al menos, por ahora es necesario!

image

Error: “There was an error attaching the debugger to the IIS worker process for ULR ‘http://127.255.0.0:82/’ for role instance ‘deployment16(70).<application_name>_IN_0’. Unable to start debugging on the web server. The underlying connection wass closed: An unexpected error occurred on a receive”.

image

Si accedemos a la url http://127.0.0.82 o ejecutamos con “Ctrl + F5”:

HTTP Error 500.19 – Internal Server Error

image

 

El detalle del error en el “Event View” es este:

An unhandled win32 exception occurred in w3wp.exe [2624]. Just-In-Time debugging this exception failed with the following error: The operation attempted is not supported. Check the documentation index for ‘Just-in-time debugging, errors’ for more information.

Adicionalmente, también se producen errores en el AppPool (generado dinámicamente):

Application pool ’03c09aa3-4317-4b51-bb1e-818250488df5′ is being automatically disabled due to a series of failures in the process(es) serving that application pool.

y un warning:

A process serving application pool ’03c09aa3-4317-4b51-bb1e-818250488df5′ suffered a fatal communication error with the Windows Process Activation Service. The process id was ‘2624’. The data field contains the error number.

Solución:

Después de muchas vueltas, la solución es cambar la identidad del pool de “Networkservices” a “LocalSystem”.  El inconveniente de esta solución es que cada vez se ejecute el emulador tendremos que realizar esta modificación, lo que no resulta ”nada” productivo.

  • Una de las soluciones pasa por seguir los pasos que comenta Wade Wegner en este post, donde se incluye código en el “OnStart()” de cada Role, a fin de otorgar permisos al pool. Esta acción es propia para un entorno de producción, pero no para el emulador, donde, de hecho, no funciona.
  • Así que la solución, finalmente se reduce a, comentar las Sección “<Sites>” del fichero de configuración  “ServiceDefinition.csdef” . En cuyo caso, no se hace uso de IIS, sino del “Hosted Web Core” (HWC) donde el proceso pasa a ser “WaIISHost.exe” en lugar del “w3wp.exe”. 
   1: <?xml version="1.0" encoding="utf-8"?>

   2: <ServiceDefinition name="WindowsAzureProject1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">

   3:   <WebRole name="WebRole1" vmsize="Small">

   4:     <!--<Sites>

   5:       <Site name="Web">

   6:         <Bindings>

   7:           <Binding name="Endpoint1" endpointName="Endpoint1" />

   8:         </Bindings>

   9:       </Site>

  10:     </Sites>-->

  11:     <Endpoints>

  12:       <InputEndpoint name="Endpoint1" protocol="http" port="80" />

  13:     </Endpoints>

  14:     <Imports>

  15:     </Imports>

  16:   </WebRole>

  17: </ServiceDefinition>

Si ya conoces Full IIS, te habrás dado cuenta, que  estas capacidades no son soportadas por la solución aceptada, no obstante, espero haber evitado algún dolor de cabeza y conseguir continuación con una feliz depuración en el Emulador de Windows Azure.

 

Otras referencias:

 

Saludos @home

Juanlu, elGuerre

Ya está aquí: ”1600.2487.8107.12070” para España. Multiplica por 3 la duración del Lumia 800 !!!

Untitled

 

Hace ya unos días escribía este post, acerca del nuevo update para nuestro Lumia 800 y donde comentaba las nuevas mejoras que incorporaría. Pues bien, finalmente, ya lo tenemos aquí para España, aunque por el momento sólo con versión Vodafone. No es un impedimento, de hecho, algunos compañeros ya han instalado la versión de la India y todo va sobre ruedas.

Como siempre, si no quieres esperar a que aparezca la actualización en Zune, puedes hacerlo a través de Nokia Care (v2012.12.5.3) y NaviFirm Plus 1.7.

Si ya tienes instalado Windows 8 Consumer Preview, asegúrate de instalar Nokia Care como administrador.  Si después de esto, te encuentras con problemas de conexión con el móvil, accede la carpeta “C:Program Files (x86)NokiaNokia Care SuiteDrivers” e instala y/o repara cada uno de los drivers que en ella se encuentran, eso si, asegúrate que lo haces como administrador.

Una vez hayas realizado todos estos pasos, asegúrate de que no se encuentra conectado el móvil y ejecuta la aplicación Nokia Care lanzando la siguiente “Tool”:

image

Después, conecta el móvil y podrás ver algo como lo siguiente:

image

En este punto, estas en disposición de descargarte el Software y actualizar. Como siempre, directamente con Nokia Care o con NaviFirm Plus 1.7:

image

Yo aún, y muy a mi pesar, sigo impaciente y esperando a la “Variant” de España para mi “059M580”, además, no me gusta el logo de Vodafone al arrancar mi lumia, ¡esto es ya capricho de cosecha propia! jeje…

Por otro lado, y si aún así, no quieres esperar más, gracias a nuestro compañero Dani Alonso, también podrás conseguirlo siguiendo esta otra alternativa.

Lo mejor de todo, es que parece que en esta ocasión no perderemos nada de lo que ya tengamos instalado!!!

¡Ahora si que finalmente nuestro Nokia es un verdadero Nokia!

Saludos
@JuanluElGuerre

How To: Load Test para tus “Integration Test” en cada uno de tus entornos en un sólo click !!!

imageMuy buenas,

En la mayoría de los proyectos, además de los “Unit Test”, siempre existen un conjunto de pruebas que es necesario llevar a cabo a fin de validar que nuestro entorno se ejecutará de manera correcta y ya no sólo en un entorno, si no más de uno, concretamente entornos como “Integración” y “Preproducción”.

Rara vez, los “Mock” son creados, otras  veces, los “Unit Test” consumen servicios WCF con url distintas dependiendo del entorno, las buils funcionan para un entorno pero no para el otro porque los Endpoint no tiene la url correcta, etc., y así sucesivamente… Y por si fuera poco, a la hora de “la puesta en producción” siempre surge algún imprevisto,… ¡Cuantas veces hemos visto esto!

En el día a día, llevar a cabo estos test siempre cuesta: El ”copy + paste”, en ocasiones hasta podemos llegar a ser meros “autómatas”: Búsqueda en Google, copio, modifico,  ejecuto, etc..

En fin,  creo que esto ya lo conocemos todos y no voy a entrar en la manera de hacer los test puesto que ya existen infinidad de Best Practices, recomendaciones, ejemplos, etc. sobre ello. En lo que si quiero entrar es en los “Load Test” o Tests de Carga, a los que yo, particularmente también llamaría “Integration Test” y a continuación veréis por qué:

Supongamos una aplicación Web que consume servicios WCF:

  • Creamos un proyecto de tipo “Test” y le añadimos al nombre, el sufijo “.IntegrationTest”. En este proyecto creamos todos los tests necesarios para probar nuestro aplicativo.
  • Como sabrás, en proyectos web tenemos la opción del menú contextual “Add Config Transform”, cosa que no ocurre en los proyectos de tipo test. Por tanto, editamos el fichero de proyecto “.csproj” (previa acción: “Unload Project”) e incluimos en nuestro “.config” las líneas de la 6 a la 13 según el siguiente “code snippet”:
   1: <ItemGroup>

   2:     ...

   3:     <None Include="App.config">

   4:       <SubType>Designer</SubType>

   5:     </None>

   6:     <None Include="App.Integracion.config">

   7:       <DependentUpon>App.config</DependentUpon>

   8:       <SubType>Designer</SubType>

   9:     </None>

  10:     <None Include="App.PreProduccion.config">

  11:       <DependentUpon>App.config</DependentUpon>

  12:       <SubType>Designer</SubType>

  13:     </None>   

  14:     ...

  15: </ItemGroup>

  • En la misma ruta física donde se encuentre el fichero App.config creamos dos ficheros con los nombre “App.Integracion.config” y “App.PreProduccion.config” con el siguiente contenido inicial:
   1: <?xml version="1.0"?>

   2: <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

   3:   <system.web>    

   4:   </system.web>

   5: </configuration>

Nota: El echo de incluir este namespace en nuestros “.configs”, nos permite tener la transformación adecuada con respecto al fichero original “App.config”.   Toda la información a estas transformaciones puedes encontrarla en este link.

  • Guardamos los ficheros y cargamos (“Reload Project”) nuevamente el proyecto en Visual Studio, veremos lo siguiente:

image

  • En este punto, necesitamos crear las diferencias de configuración de cada uno de los entornos en el “.config” adecuado. El “App.config” contendrá el contenido común a la configuración de ambos entornos.
    • Ejemplo para un EndPoints:
   1: <system.serviceModel>    

   2:     <client xdt:Transform="Insert">

   3:       <endpoint address="https://localhost/Service1.svc"

   4:       binding="customBinding" bindingConfiguration="HttpBinaryBinding"

   5:       contract="IService1" name="CustomBinding_Service1"/>

   6:     </client>

   7: </system.serviceModel>

  • Cada de transformación tendrá la configuración particular de cada entorno.
  • Para que todo funcione, y nuestros tests prueben íntegramente los servicios dependiente del entorno, es necesario volver a incluir las siguientes líneas en nuestro “.csproj” (“.IntegrationTest”)" al final del mismo y antes de los cierre de tags </target></Project>:
   1: <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)MicrosoftVisualStudiov10.0WebMicrosoft.Web.Publishing.Tasks.dll" />

   2: <Target Name="AfterCompile" Condition="exists('app.$(Configuration).config')">

   3:   <!-- Generate transformed app config in the intermediate directory -->

   4:   <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />

   5:   <!-- Force build process to use the transformed configuration file from now on. -->

   6:   <ItemGroup>

   7:     <AppConfigWithTargetPath Remove="app.config" />

   8:     <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">

   9:       <TargetPath>$(TargetFileName).config</TargetPath>

  10:     </AppConfigWithTargetPath>

  11: ItemGroup>

  12: </Target>

  • Ahora sólo nos queda configurar el “click” de cambio de entorno. Para ello, creamos dos nuevas “Solution Cofiguration”::

image

  • Finalizado este punto, ya estamos en disposición de lanzar nuestros test en nuestros dos entornos simplemente cambiando el “Configuration Name”

Llegado este punto, podemos incluir en nuestras buils  estos test a fin de que nuestro sistema quede totalmente integrado. Pero, ¿Donde están los “Load Test” ? Pues bien, bastará con que :

  • Añadamos a nuestro proyecto de test un nuevo item “Load Test…”
  • Añadamos los test a chequear (“.IntegrationTest”) en la ventana de “Edit Test Mix”

image

  • Y, todo listo, a analizar los resultados:

clip_image001

Hasta este punto, hemos realizado un integración completa probando la lógica de presentación, desde el “Presenter” en un patrón MVP o desde el “Controler“ en en el patrón MVC y siempre, con un desacoplamiento del contexto “Web”. Ventaja

Si ahora incluimos en  nuestro proyecto  test de tipo  ”Web Performance Test”, ya tenemos la integración completa incluida nuestras páginas .ASPX. Eso sí, para seguir haciendo uso de “Un sólo click por entorno”:

  • Generamos el código a partir de Web Test.

image

  • Y configuramos la URL en nuestros “.config”
   1: WebTestRequest request1 = new WebTestRequest("http://localhost:49570/default.aspx");

   2: request1.ThinkTime = 5;

   3: request1.Method = "POST";

   4: FormPostHttpBody request1Body = new FormPostHttpBody();

   5: request1Body.FormPostParameters.Add("__VIEWSTATE", "/wEPDwUKLTQ1NTczNzkyNGRkTZU93NCSzcCZ5pxELADnsc9UqyEWuBmSoft7FRTH4es=");

   6: request1Body.FormPostParameters.Add("__EVENTVALIDATION", "/wEWBQL86K7VBQLR49OXDQKm1J7DAwKB3audDALT8MqYCCqSOYhduF9mB1R1c58WGZTcWirhoI3Guwfza" +

   7:         "hrT86tK");

   8: request1Body.FormPostParameters.Add("ctl00$MainContent$TextBox1", "1");

   9: request1Body.FormPostParameters.Add("ctl00$MainContent$btnSync", "Sync");

  10: request1.Body = request1Body;

  11: yield return request1;

  12: request1 = null;

Nota: Para la ejecución de los “Load Test” y a fin de que la ejecución de estos test de carga se asemeje a la carga de nuestra aplicación en el entorno de Producción, recomiendo dividir los “Web Performance Test” por funcionalidad concreta, de manera que el reparto de carga (en la ventana “Edit Test Mix”) se acerquen más a la carga real.  Es decir, podríamos generar “Web Performance Test”  por operación a realizar por el usuario, básicamente, podríamos asemejarlos a los test que hemos generado para la integración de nuestro sistema con los Servicios WCF.

Es muy importante llevar a cabo los Test de Carga para cada una de nuestras aplicaciones, principalmente, para poder estimar el dimensionamiento de la infraestructura que dará soporte a nuestra aplicación y no encontrarnos sorpresas o imprevistos no contemplados.

Nuestros “Integration Test” y la ejecución de test por entornos garantiza en cualquier momento y a un sólo click de ratón que nuestro aplicativo esta esta en perfecto estado.  Recomiendo estos tests en cualquier caso, pero sin lugar a dudas, en aquellos casos en los que las “Buils” no puede ser usadas por algún motivo “inexplicable” !!!

Saludos

@JuanluElGuerre

TFS Service Preview on Windows Azure

image

Ya tengo mi TFS particular en Windows Azure. Aquí os dejo algunos pasos  para que veáis como funciona:

  • Seguimos los pasos del tu site de TFS Service Previos.
  • Descargamos el software necesario para poder acceder desde nuestro Visual Studio

image

  • Creamos nuestro primer proyecto:

image

  • Esperamos a que se complete el proceso de creación  y obtengamos el mensaje de éxito.

image

Lo mejor de todo, ese mensaje,  “Your project is created and your team is going to absolutely love this.”, jeje…

Una vez creado nuestro Team project  e instalado el Fix comentado anteriormente , podremos acceder desde nuestro Visual Studio a este nuevo TFS de la misma manera que accedemos a cualquier otro TFS On-Premise.

El único inconveniente, es que por el momento parece que no podemos crear “Team Project” directamente desde Visual Studio:

image

En cuanto a lo demás, sin problema, podremos crear “Work Items”, Añadir proyectos al TFS, Check In, Ckeck Out, etc.  ¡Tendremos que seguir probando!

Si quieres aprender más echa un vistazo a este enlace: http://blogs.msdn.com/b/visualstudioalm/archive/2011/09/14/learning-about-team-foundation-service-preview.aspx

Si queréis vuestro propio TFS sólo tenéis que acceder a este enlace y esperar a que Microsoft os facilite el código de invitación

Saludos
@JuanluElGuerre