Instalar un Servicio Windows en Azure

WindowsService2AzureSi estamos desarrollando una nueva solución para desplegar en Windows Azure y necesitamos ejecutar tareas periódicas o en background, lo más recomendable es utilizar para ello un Worker Role.

Muchas veces sin embargo nos encontramos con que vamos a migrar una solución ya desarrollada previamente y en ese caso es frecuente encontrarse con que tenemos desarrollados una serie de Servicios Windows. En este artículo veremos cómo podemos instalar estos servicios para que sigan funcionando en la Plataforma Windows Azure sin necesidad de tocar ni una sóla línea de código. Al final del post podéis encontrar un enlace para descargar el proyecto de ejemplo.

Partiremos del supuesto de que ya disponemos de un Servicio Windows desarrollado con .NET Framework 4.0. Si os interesa, en esté artículo de MSDN o en este post de Return(GiS) podéis ver cómo se haría.

Pasos para desplegar el servicio en un Web Role de Windows Azure

  • Partiremos de una solución ya creada en Visual Studio en la que contamos con un proyecto de tipo Cloud y una aplicación web a la que hemos llamado “FrontEnd_Web”. La solución deberá utilizar el SDK 1.3 o superior de Windows Azure.
  • Añadimos una carpeta llamada “startup” al proyecto web.
  • Copiamos el ejecutable del Servicio Windows que queremos instalar a la carpeta “startup”. En nuestro ejemplo el servicio es “DemoWindowsService.exe”
  • Asegurarse de que la ficha de “Propiedades” del ejecutable tiene los siguientes atributos:
    • Build Action: None
    • Copy to Output Directory: Copy Always
  • Abrir Notepad y guardar un archivo de proceso por lotes. En nuestro caso tendrá el nombre de “installservice.cmd” y lo guardamos en la carpeta “startup” del proyecto que antes hemos creado.
  • Ahora, para que se muestre en Visual Studio debemos poner el cursor en la carpeta “startup”, botón derecho y la opción de “Add Existing Item”.

VS2010_Capture

  • A continuación edito mi archivo de proceso por lotes ya que ahí deberé incluir el código para instalar el servicio con InstallUtil (versión de 64 bits) y luego arrancarlo. En esta caso “MyService” es el nombre que tiene mi Servicio Windows. Habrá que sustituirlo en cada caso por el nombre que corresponda. En nuestro caso, el archivo installservice.cmd por tanto tendrá estas 2 líneas:

%WinDir%\Microsoft.NET\Framework64\v4.0.30319\Installutil.exe startup\DemoWindowsService.exe

NET START MyService

  • Para asegurarme de que mi Web Role se despliega con Windows Server 2008 R2, tendré que editar ServiceConfiguration.cscfg y modificar la versión del sistema operativo con osFamiliy=”2” (en la segunda línea del fichero XML).
  • Es recomendable también habilitar los diagnósticos en las propiedades del Web Role e indicar los datos de una cuenta de Azure Storage.
  • A continuación habilitaremos también el Escritorio Remoto para poder validar luego que nuestro servicio se ha instalado correctamente.
  • Y por último, lo más importante. Tenemos que añadir la tarea de arranque en el ServiceDefinition.csdef. Para ello añadiremos las etiquetas de <Startup> que deberán estar dentro de las etiquetas de <WebRole>. Nótese que definimos la tarea del tipo “background” para que toda la tarea se ejecute en segundo plano. Más información sobre las tareas de arranque en este artículo. En nuestro caso nos queda este archivo:

ServiceDefinition

Ya lo tenemos. Ahora basta con generar el paquete de despliegue y subirlo a Windows Azure. Al arrancar la instancia o instancias de nuestro Web Role, se lanzará el fichero batch instalando nuestro Servicio Windows y luego lo iniciará. Ahora podéis conectaros por Escritorio Remoto a vuestra instancia y podréis verificar que vuestro servicio está instalo y funcionando como en esta imagen:

RemoteDesktopAzure

Código fuente del ejemplo:

Servicio Windows de ejemplo Servicio Windows en Azure

Nada más, espero que sea útil. Comentarios bienvenidos como siempre.

How to install a Windows Service in Windows Azure