Añadir dlls en la GAC de las máquinas de Windows Azure

Una de las opciones más sencillas para acondicionar las máquinas en Windows Azure es configurar un startup con los instalables necesarios para frameworks y complementos que utilizamos dentro de nuestra aplicación. La parte negativa de este sistema es que, si necesitamos instalar varios paquetes con el fin de tener varias librerías ubicadas en la GAC de Windows Azure es que  la subida se hace cada vez más lenta debido al peso de cada uno de los instalables.

Si conocemos cuáles son las librerías que necesitamos para que nuestra aplicación funcione correctamente en un entorno que no sea de desarrollo, podemos seguir los siguientes pasos para instalar dichas dll en la GAC sin tener que utilizar un paquete de instalación :)

En este post vamos a añadir dos librerías a través de un startup. Lo primero que necesitamos localizar es la herramienta gacutil.exe. Esta herramienta nos permitirá realizar la instalación de las dll a través de un bat que utilizaremos como startup. La misma se encuentra en %programfiles%Microsoft SDKsWindowsv7.0ABinNETFX 4.0 Tools y debemos añadir dentro de nuestra solución tanto el archivo gacutil.exe como gacutil.exe.config. Ambos archivos deben tener la propiedad Copy Local a True para que sean incluidos dentro del paquete de subida a Windows Azure. Del mismo modo, las DLL que queramos añadir en la GAC deberán tener este mismo atributo a true para asegurarnos que están dentro de la carpeta bin que se incluirá en la subida.

Una vez establecidos estos pasos, debemos crear un .bat con la siguiente información:


%~dp0gacutil.exe /nologo /i %~dp0Microsoft.IdentityModel.dll

%~dp0gacutil.exe /nologo /i %~dp0EntityFramework.dll

exit /b 0

Lo que estamos haciendo en el mismo es invocar a la herramienta gacutil.exe (el prefijo ~dp0 se utiliza para indicar que ese ejecutable o dll está en la misma carpeta donde se encuentra el .bat que estamos ejecutando) para que se añadan las librerías indicadas en la misma línea a la GAC de la máquina virtual que se está configurando.

Definimos el la tarea dentro del apartado startup del archivo ServiceDefinition.csdef y, del mismo modo, ponemos el atributo Copy Local a True para que sea parte de la subida.

 <WebRole name="Web" vmsize="Small">
    <Startup>
      <Task commandLine="RegisterGAC.bat" executionContext="elevated"></Task>
    </Startup>
    <Sites>

De este modo seremos capaces de añadir dichas librerías sin la necesidad de subir los paquetes de instalación y que la subida sea mucho más liviana.

Espero que sea de utilidad :D

¡Saludos!

Error con certificados y Windows Azure Management API: The request was aborted: Could not create SSL/TLS secure channel.

Uno de los requisitos cuando trabajamos con las APIs de administración de Windows Azure es que las peticiones que realicemos utilicen un certificado que anteriormente hayamos subido al portal de Windows Azure. Cuando varias personas trabajan en el mismo proyecto, para no tener que trabajar cada uno con un certificado diferente, lo normal es exportar uno de ellos y que los demás desarrolladores lo importen en sus máquinas para las peticiones a la nube. Llegados a este punto, uno de los problemas que nos podemos encontrar es el siguiente:

Cuando esto ocurre, una de las posibilidades es que, al importar el certificado, el usuario NETWORK SERVICE haya perdido permisos sobre las claves privadas del certificado que permiten firmar la petición (El GUID asignado en cada máquina es diferente). Para solucionar esto, podemos abrir una ventana de Microsoft Management Console (mmc) y añadir el complemento de los Certificates del usuario o del equipo, dependiendo de dónde tengamos importado el mismo. Una vez tengamos localizado el certificado, pulsamos sobre él con el botón derecho y seleccionamos All tasks -> Manage Private Keys…

Dentro de este cuadro de diálogo podremos añadir tanto los grupos y/o usuarios que pueden tener acceso a las claves privadas de este certificado. En el caso de Windows Azure, añadiremos NETWORK SERVICE.

Si ejecutamos de nuevo nuestro código, nuestro emulador tendrá permisos suficientes para poder realizar la petición.

Espero que sea de utilidad :D

¡Saludos!

Aplicaciones imprescindibles en Windows Phone 7

Después de probar varias aplicaciones disponibles actualmente en el marketplace de Windows Phone 7, me gustaría compartir aquellas que creo que son imprescindibles en nuestros dispositivos :)

Adobe Reader: Una de las aplicaciones que no necesita presentación. Gracias a ella podremos disfrutar de nuestros archivos en formato PDF.
Facebook: Aplicación oficial desarrollada por Microsoft Corporation. En una versión anterior presentaba bastantes errores de refresco y en ocasiones se quedaba colgada. Recientemente ha mejorado de forma considerable. Si bien una de las cosas que admiro de Windows Phone 7 es su gran integración con Facebook (permite escribir en muros, imágenes, perfil etcétera desde el propio sistema operativo), si queremos una aplicación exclusiva para esta red social, la versión oficial es altamente recomendable.
Foursquare: Aplicación oficial de foursquare. Para todos aquellos amantes del check in :D
4th & Mayor: Otro cliente para Foursquare, del cual dicen que será el sucesor de la versión oficial. Si bien a día de hoy la versión oficial sólo soporta check-in, con este cliente podremos además la crear y visualizar fotos de los lugares, disfrutar de nuevas features como “explore”, mayor rápidez en la localización de sitios próximos, entre otras.
Flory: Se trata de una aplicación dedicada a la mensajería instantánea. Actualmente nos da soporte para Google Talk y Facebook, aprovechando las notificaciones Push y Tile. Todos los mensajes son securizados y encriptados a 256 bits.
Messenger by Miyowa: Si bien la versión Mango (Windows Phone 7.5)  incorporará Windows Live Messenger, mientras tanto podemos ir abriendo boca con este cliente con notificaciones Tile.
Beez: Cliente para la famosa red social Twitter con notificaciones Tile. Una de las características que más me motivan al utilizar un cliente para esta red social es poder recibir notificaciones de menciones y mensajes privados que recibo a través de la misma. Esta es la aplicación que más se acerca a mis necesidades, aunque las notificaciones llegan en ocasiones con un retardo considerable :(
Twitter: Aplicación oficial para Twitter. Encantada con su interfaz gráfica donde podemos ver claramente toda la información de la plataforma. A diferencia de la anterior no aprovecha las notificaciones Tile… Por el momento espero :)
Birdsong: Otro cliente de Twitter con gran acogida que nos ofrece nuevas características: configuración del timeline con listas, búsquedas guardadas, etcétera, integración de las imágenes twitteadas, tweets mostrados en modo conversación, thread de mensajes privados, integración con Places, etcétera.
Rowi: Cliente de pago para Twitter que nos ofrece notificaciones push y una interfaz limpia. Si bien dispone de una versión free con el inconveniente publicitario :) por $2,99 podemos disfrutar la misma libre de ads.
Shazam: Aplicación conocida por todos aquellos clientes de iPhone, iPad, Android, BlackBerry y Nokia que nos permite detectar información sobre la canción que está sonando.
TextMe: Si bien soy una gran fan de WhatsApp, por el momento no tenemos una versión disponible para Windows Phone 7. Para seguir ahorrando en nuestros SMS, MMS, etcétera podemos hacer uso de TextMe (también disponible para iPhone) el cual nos aporta una función similar a WhatsApp.
Microsoft Tag: Se trata de un lector de tags made in Microsoft :) con el que podremos descifrar y leer el contenido de los mismos.
Amazon Kindle: Otra de las aplicaciones que no podía faltar era el cliente de Amazon para la lectura de nuestros libros comprados en la gran tienda virtual de esta compañía.
WordPress: Gestor de nuestros blogs gestionados con WordPress. Nos permite tanto postear, administrar páginas, comentarios, etcétera.
Ebay: Excelente cliente para la conocida página de subastas donde podremos buscar, seguir, pujar, pagar e incluso enviar mensajes a los vendedores.
AppFinder: Aplicación complementaria para localizar contenido dentro del marketplace de Windows Phone 7. Actualmente el buscador por defecto del sistema operativo no está lo suficientemente optimizado y a veces se complica la localización de algunas aplicaciones.
NextGen Reader: Lector de RSS que nos permite sincronizar con nuestros feeds de Google Reader. Además nos ofrece modo offline, compartir artículos en Twitter, enviar feeds a Instapaper, entre otros.
Fruit Ninja: Juego ya conocido por los usuarios de apple donde debemos cortar todas aquellas frutas que aparezcan en pantalla como un autentico ninja :D ¡Cuidado! ¡Super adictivo! ;)
Shuriken Ninja: Prueba tu destreza como un auténtico ninja :)
Cut it!: Aplicación para acortar URLs y guardarlas en el histórico.
Spotify: Aplicación por escelencia para escuchar música de manera legal en nuestros smartphones. Existe un trial para probar la versión Premium. ¡Altamente recomendable!
WhatsApp: Aplicación disponible para múltiples plataformas (iPhone, Android, Blackberry y Nokia) para enviar mensajes de forma gratuita a través de nuestra conexión de datos. La aplicación es gratuita pero el servicio costará $1.99 dólares a partir del primer año.
Simple Dropbox: Aplicación gratuita para conectarse y compartir archivos a través de Dropbox.
Flickr: Aplicación oficial del servicio de fotos Flickr.
GDocs: Cliente para el acceso a Google Docs desde Windows Phone.
Angry birds: Este es un juego que creo que no necesita presentación :D Ya tenemos la versión disponible de Angry Birds para Windows Phone de unos pollos muuuy cabreados :D
AppFlow: Similar a AppFinder para la búsqueda de nuevas aplicaciones dentro del marketplace de Windows Phone.
Favoritos: Aplicación creada por uno de mis lectores :D la cual permite guardar los contactos más usados como favoritos y tener un acceso más rápido a los mismos para realizar llamadas.
Offline Maps: Si no quieres arruinarte con los cargos de roaming, esta aplicación es más que recomendable para aquellos que viajamos a menudo :D
Tango: Te permite realizar llamadas gratuitas y mantener el contacto con amigos y familia, al estilo WhatsApp. Está disponible también para otras plataformas. Más información.

¿Alguien da más? :D

¡Saludos!

Herramienta appcmd para configurar nuestro IIS de las máquinas de Windows Azure

Desde que tenemos acceso total al servidor IIS instalado en nuestras instancias de Windows Azure podemos personalizar el mismo para poder ajustarlo a nuestras necesidades. Lo que si que es cierto es que, desde hace algunos años, estamos tan acostumbrado a trabajar desde la interfaz que nos proporciona Microsoft para manejar nuestros roles de Windows Server que muchas veces hacemos caso omiso de las herramientas igualmente útiles de las que disponemos desde la línea de comandos.
Para poder llevar a cabo las modificaciones pertinentes, es necesario el uso de  startups, por lo que nos “obliga” a conocer estas herramientas.

En este post en concreto voy a mostrar cómo podemos lanzar una configuración específica para modificar el valor por defecto de una de las secciones IIS. Obviamente no podré mostrar todas :) pero, al final, con un ejemplo prácticamente es similar para el resto de ellos.

Nota: Para conocer el detalle sobre cómo hacer uso de los startups podéis ver un ejemplo en el siguiente post. En este solamente comentaré comandos relacionados con IIS que podemos usar dentro de los startups.

Localización del comando appcmd

En primer lugar, es importante saber que la herramienta appcmd no está incluida dentro de la variable path del sistema, por lo que tenemos la opción de añadir la ruta del comando dentro de dicha variable o bien, de una forma más rápida, utilizar el comando desde la ruta completa de su localización:

%systemroot%system32inetsrvappcmd

Una vez que tenemos localizada la ruta de la herramienta podemos invocar la misma utilizando el siguiente conjunto de comandos:

  • List: Nos mostraría todos los objetos disponibles dentro de la máquina.
  • Add: Se utilizaría para la creación de nuevos objetos.
  • Delete: Elimina el objeto especificado por el ID del mismo.
  • Set: Configura parámetros dentro del servidor IIS.

En realidad, no me quiero centrar en cada uno de ellos. Para conseguir más información al respecto podéis hacerlo a través del siguiente enlace. Por el momento, el top de estos comandos suele ser Set ya que nos permite modificar valores que ya existen dentro de IIS y que, por algún motivo, necesitamos modificar su valor por defecto.

Para verlo con un ejemplo, un caso muy común sería habilitar los Parent Paths cuando trabajamos con ASP clásico. Para ello podemos lanzar el siguiente startup junto con nuestra solución:


start /w pkgmgr /iu:IIS-ASP

%systemroot%system32inetsrvappcmd set config -section:asp -enableParentPaths:true

En este ejecutable lo único que hacemos es, en primer lugar habilitar ASP clásico en el servidor IIS de la máquina virtual, ya que por defecto no está habilitado, y en segundo lugar utilizando la herramienta appcmd modificamos la configuración de la sección ASP que acabamos de habilitar indicándole que el valor del parámetro enableParentPaths debe ser igual a true.

Lo único que debemos tener en cuenta es la estructura de la llamada, siguiendo siempre el mismo patrón:

appcmd.exe set config [ConfigurationPath] /section:name /parameter_name:value

Por último me gustaría dejar un par de enlaces que creo que pueden ser de utilidad al respecto para alguna de las secciones más utilizadas/personalizadas de nuestro IIS :)

Configuración de HTTP Logging, HTTP Redirection, HTTP response headers and HTTP Compression.

Espero que sea de utilidad :D

¡Saludos!

Varios servicios hospedados dentro de un mismo Hosted Service de Windows Azure – Full IIS

Hace unos cuantos días, lo siento por el retraso :( , uno de mis followers me preguntó si era posible tener un sitio web y un web service en una misma máquina virtual de Windows Azure. Lo cierto es que si :) Desde que tenemos control total sobre IIS somos capaces de crear tanto sitios, directorios virtuales como aplicaciones virtuales que cuelguen desde el IIS de la máquina virtual de Windows Azure Compute.
Para este post, tengo una pequeña demo donde muestro cómo es posible crear directorios y aplicaciones virtuales dentro de un Web Role. La estructura sería la siguiente:

Como se puede ver en la imagen anterior tenemos dos proyectos: un web role, dentro de este una carpeta llamada statichtml y un proyecto de WCF que será mi servicio web. Por otro lado, en el proyecto de Windows Azure observamos que únicamente tenemos un sólo rol dado de alta. Para poder hacer esta “mezcla” debemos centrarnos en el archivo ServiceDefinition.csdef

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="WebRole_WebService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="aspnetWebRole" vmsize="Small">
    <Sites>
      <Site name="Web">
        <VirtualApplication name="myWebService" physicalDirectory="..WcfService">
        </VirtualApplication>
        <VirtualDirectory name="myStaticHtml" physicalDirectory="..aspnetWebRolestatichtml">
        </VirtualDirectory>
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
    </Imports>
  </WebRole>
</ServiceDefinition>

Por decirlo de alguna manera, tenemos un proyecto máster dentro de nuestra solución: aspnetWebRole. Dentro de la configuración del mismo, tenemos un apartado llamado Sites donde podemos añadir tanto sitios nuevos, como directorios virtuales y aplicaciones virtuales.
Para poder definir qué es cada cosa tenemos una serie de tags organizados de forma jerárquica donde definimos qué directorios y qué aplicaciones virtuales pertenecen a qué sitio.

Nota: el atributo physicalDirectory es relativo al archivo ServiceDefinition.csdef. De todos modos, si no nos queda claro cómo montar el path, al intentar publicar el sitio en el apartado Errors de nuestro Visual Studio 2010 nos mostrará la ruta en la cual está intentando buscar.

Si ejecutamos este código a través del emulador y accedemos a nuestro IIS en local, podremos observar que hemos conseguido la siguiente estructura dentro de nuestro servidor web:

Adjunto el proyecto por si fuera de utilidad :D

¡Saludos!